LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: 刻苦猫

抱歉斑竹,有关(++i)+(++i)+(++i)的贴子,想再讨论

[复制链接]
 楼主| 发表于 2006-1-12 13:17:05 | 显示全部楼层
仔细又看了一遍C99里有关prefix increment的描述,可惜没有找到c89的文档

The value of the operand of the prefix ++ operator is incremented. The result is the new
value of the operand after incrementation. The expression ++E is equivalent to (E+=1).

像(++i) + (++i)这样的演算不是undefined behavior!而是完全限定的
先做两次自增运算,然后取i的值相加,算
i=2;
r = (++i) + (++i);

我认为r就应该是8

--------------------------------------------
我想我得说明一下,我在写一个类似于C模拟器的程序,标准里undefined的东西当然
怎么来都行,但是如果不幸的被明确define了,那就麻烦了。例如常见的&&运算,左
运算对象为0时不引用右对象值,最常见的陷阱就是诸如func1()&&func2()的写法,

虽然我自己写程序连while(i--)这样的含义明确的写法都不用,可是为了测试,每天
都在琢磨各种可能的不良写法,痛苦啊。
回复 支持 反对

使用道具 举报

发表于 2006-1-12 22:12:30 | 显示全部楼层
看来楼主还是没有理解,不妨仔细看看我上面的那段英文摘抄。这儿主要的问题是语句中的各个单独的元素的运算先后顺序,而不是关系到prefix increment的东西:
r = (++i) + (++i);
这个语句中前后两个++i的调用顺序以及取i的顺序是不确定的。就是undefined behavior,取决于编译器,它可以先取得i的值(这儿是2),然后分别做两次++i,再相加,于是结果就是:
r = 6
然而编译器也可以先计算第一个++i而不管第二个,就是先把i递增,然后把值存回i,然后再执行第二个++i,然后直接将两次的结果tmp值相加这儿的结果将会是:
r = 7
或者是,最后还是取i的地址处的值相加,而得到:
r = 8
这些顺序C的标准是没有规定的,这取决于编译器,因为这和硬件构架以及优化之类的密切相关。

不知道我是否解释清楚了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表