我试图理解这个页面上的例子让我的大脑皱起了眉头: 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 ++之间评估差异的解释是什么?谢谢你。
答案 0 :(得分:11)
当操作有副作用时,C ++依赖sequence points规则来决定何时副作用(例如增量,组合赋值等)必须生效。逻辑and-then
/ or-else
(&&
和||
)运算符,三元?
问号运算符和逗号创建序列点; +
,-
,<<
等不会。
相比之下,Java在进行进一步评估之前完成了副作用。
如果在没有序列点的情况下多次使用带有副作用的表达式,则在C ++中未定义结果行为。任何结果都是可能的,包括一个没有逻辑意义的结果。
答案 1 :(得分:5)
Java保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。在评估右侧操作数的任何部分之前,似乎完全评估了二元运算符的左侧操作数。 Java还保证在执行操作本身的任何部分之前,运算符的每个操作数(条件运算符&&
,||
和?:
除外)都会被完全评估。有关更多详细信息,请参阅Java语言规范§15.7。
答案 2 :(得分:3)
在C ++中,子表达式的评估顺序不是从左到右,也不是从右到左。它是 undefined 。