免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2288 | 回复: 11
打印 上一主题 下一主题

初学,请教一个问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-15 16:10 |只看该作者 |倒序浏览
我用下列代码在turbo c 和 gcc中得到不同结果,不知哪一种是更加符合标准.

int main(void)
{
int j=5,q;
q=(++j)+(++j)+(++j);
printf("%d,%d",q,j);
return 0;
}

在Linux / GCC中为
22,8
在windows / TC中为
24,8

看了GCC的生成的汇编代码,在计算q时,大致步骤用如下:

++j
++j
q=j+j
++j
q=q+j

结果为7+7+8=22

TC不是很熟悉,不知道怎样能看到汇编,计算方式可能是
++j
++j
++j
q=j+j
q=q+j

结果为8+8+8=24

论坛徽章:
0
2 [报告]
发表于 2007-02-15 16:11 |只看该作者
代码编写者理应避免这种问题的出现。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2007-02-15 16:41 |只看该作者
标准没有规定它们的计算顺序。

论坛徽章:
0
4 [报告]
发表于 2007-02-15 17:08 |只看该作者
不同的编译器对这种自加的处理先后顺序不同,所以得到不同的结果很正常。不过这样写的代码,将来在不同平台移植时,就是给自己找麻烦,埋地雷。呵呵。

论坛徽章:
0
5 [报告]
发表于 2007-02-15 20:09 |只看该作者
多谢各位指点!
看了一下C语言常见问题集,虽然没太看明白不过大意应该是标准未规定这种状况的处理方法.
自增减表达式会改变变量的值,导致除第一个j外其它变量成为无定义(undefined)变量,在编译时gcc会提供警告(-Wall选项打开):
warning: operation on `j' may be undefined
标准对无定义行为没有强制要求, 编译器可以做任何事情。

论坛徽章:
0
6 [报告]
发表于 2007-02-15 21:29 |只看该作者
粗略地说,在一个表达式中改变一个对象多于一次时此表达式的行为是无定义的。

>> 自增减表达式会改变变量的值,导致除第一个j外其它变量成为无定义(undefined)变量

无定义说的是“行为”或“结果”(程序运行时的外在表现或者动作)是“无定义”的(无定义行为),不是用来修饰对象(变量)的,即没有“无定义变量”这一说。

[ 本帖最后由 whyglinux 于 2007-2-15 21:33 编辑 ]

评分

参与人数 1可用积分 +2 收起 理由
langue + 2 我很赞同

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2007-02-16 16:24 |只看该作者
lz的id原来是“人品有问题”啊。。。

论坛徽章:
0
8 [报告]
发表于 2007-02-16 16:34 |只看该作者
原帖由 W.Z.T 于 2/16/2007 16:24 发表
lz的id原来是“人品有问题”啊。。。


论坛徽章:
0
9 [报告]
发表于 2007-02-18 14:45 |只看该作者
应该和系统的进程的轮循有关系,尽量做到原子操作!个人意见请拍砖!

论坛徽章:
0
10 [报告]
发表于 2007-02-19 08:55 |只看该作者
原帖由 whyglinux 于 2007-2-15 21:29 发表
粗略地说,在一个表达式中改变一个对象多于一次时此表达式的行为是无定义的。

>> 自增减表达式会改变变量的值,导致除第一个j外其它变量成为无定义(undefined)变量

无定义说的是“行为”或“结果”(程 ...


确实应该是无定义的行为,不是无定义变量.

[ 本帖最后由 RPYWT 于 2007-2-19 09:00 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP