尝试了解这个页面上的例子,我的大脑起皱了:
http://answers.yahoo.com/question/index?qid=20091103170907AAxXYG9
http://answers.yahoo.com/question/index?qid=20091103170907AAxXYG9
更具体的这个代码:
int j = 4; cout << j++ << j << ++j << endl;
给出输出:566
现在这对我来说是有意义的,如果表达式从左到右进行评估,但是在Java中也是类似的表达式:
int j = 4; System.out.print("" + (j++) + (j) + (++j));
输出:456
这更直观,因为这表明它已经从左到右进行了评估.在各种网站上进行研究,似乎C在编译器之间的行为不尽相同,但我仍然不相信我的理解. Java和C之间的评估差异有什么解释?谢谢你.
解决方法
当操作有副作用时,C依赖于
sequence points规则来确定副作用(如增量,组合赋值等)是否必须生效.逻辑和/或/或其他(&&和||)运算符,三元?问号运算符和逗号创建序列点;,–,<等等不要. 相比之下,Java在进行进一步评估之前会完成副作用. 当您在没有序列点的情况下多次使用具有副作用的表达式时,C中未定义结果行为.任何结果都是可能的,包括没有逻辑意义的结果.