运算符优先级,哪个结果是正确的?
可能的重复:
未定义的行为和序列点
此代码后的x
的值是多少?
int x = 5;
x = ++x + x++;
在Java中,结果是12,但在C++中,结果是13。
我用google搜索了Java和C++的运算符优先级,它们看起来是一样的。那么为什么结果不同呢?是编译器的原因吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 Java 中,它的计算结果被定义为 12。它的计算结果如下:
+
(++x) 的左操作数在右操作数之前完全计算,这是由于 首先计算左手操作数。另请参阅之前的答案,和这个,关于类似的主题,并包含指向标准的链接。在 C++ 中,这是未定义的行为,因为您在没有插入序列点。
In Java it's defined to evaluate to 12. It evaluates like:
The left operand of the
+
(++x) is completely evaluated before the right due to Evaluate Left-Hand Operand First. See also this previous answer, and this one, on similar topics, with links to the standard.In C++, it's undefined behavior because you're modifying x three times without an intervening sequence point.
运算符优先级控制如何将操作数分组在一起以计算结果。它不一定控制应用副作用的顺序。
在 C++ 中,
++
运算符都将在+
运算符之前计算(尽管这只在++x
中有所不同,因为x++
的值与x
相同)。在 C++ 中,递增x
的副作用发生在下一个序列点之前,这就是我们所能说的,并且该表达式中唯一的序列点是在它被完全求值之后,包括赋值。此外,根据标准,在序列点之间多次修改对象的结果是明确未定义的。给定未定义的行为,典型的实现将执行一些操作,具体取决于实现序列如何定义行为的详细信息,因此,如果您坚持使用一个编译器的一个版本,通常会获得一致的结果。
Operator precedence governs how operands are grouped together for calculating the result. It doesn't necessarily govern the order of applying side effects.
In C++, the
++
operators will both be calculated before the+
operator (although this only makes a difference in the++x
, because the value ofx++
is the same asx
). The side effect of incrementingx
happens before the next sequence point in C++, and that's all we can say, and the only sequence point in that expression is after it is completely evaluated, including the assignment. Further, the result of modifying an object more than once between sequence points is explicitly undefined according to the Standard.Given undefined behavior, the typical implementation will do something that depends on the details of how the implementation sequences defined behavior, and so you will often get a consistent result if you stick to one version of one compiler.
这是 C++ 中未定义的行为。见标准5.4。
It is undefined behaviour in C++. See 5.4 in the standard.