繁体   English   中英

表达式评估顺序在C ++和Java之间有何不同?

[英]How does expression evaluation order differ between C++ and Java?

我试图理解这个页面上的例子,让我的大脑皱起了眉头: http//answers.yahoo.com/question/index?qid = 200991103170907AAxXYG9

更具体地说这段代码:

int j = 4;
cout << j++ << j << ++j << endl;

给出一个输出:566

现在,如果从右到左计算表达式,这对我来说是有意义的,但是在Java中有类似的表达式:

int j = 4;
System.out.print("" + (j++) + (j) + (++j));

给出输出:456

这更直观,因为这表明它是从左到右进行评估的。 在不同的网站上研究这个问题,似乎在C ++中,编译器之间的行为有所不同,但我仍然不相信我理解。 Java和C ++之间评估差异的解释是什么? 谢谢你。

当操作有副作用时,C ++依赖于序列点规则来决定何时副作用(例如增量,组合赋值等)必须生效。 逻辑and-then / or-else&&|| )运算符,三元? 问号运算符和逗号创建序列点; +-<<等等不要。

相反,Java在进行进一步评估之前完成了副作用。

如果在没有序列点的情况下多次使用带有副作用的表达式,则在C ++中未定义结果行为。 任何结果都是可能的,包括一个没有逻辑意义的结果。

Java保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。 在评估右侧操作数的任何部分之前,似乎完全评估了二元运算符的左侧操作数。 Java还保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&&||?: &&除外。 有关更多详细信息,请参阅Java语言规范§15.7。

另一方面,如果表达式不明确,那么C ++很高兴让你逃避未定义的行为,因为语言本身并不保证任何子表达式的评估顺序。 有关详细信息,请参阅序列点

在C ++中,子表达式的评估顺序不是从左到右,也不是从右到左。 这是未定义的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM