此代码后x
的价值是多少?
int x = 5;
x = ++x + x++;
在Java中,结果是12,但在C ++中,结果是13。
我用Google搜索了Java和C ++的运算符优先级,它们看起来一样。那么为什么结果不同呢?是因为编译器吗?
答案 0 :(得分:21)
在Java中,它被定义为评估为12.它评估如下:
x = ++x + x++;
x = 6 + x++; // x is now 6
x = 6 + 6; // x is now 7
x = 12 // x is now 12
由于Evaluate Left-Hand Operand First,+
(++ x)的左操作数在右边之前被完全评估。有关类似主题的信息,请参阅此previous answer和this one,其中包含指向该标准的链接。
在C ++中,它是未定义的行为,因为你在没有干预sequence point的情况下修改x三次。
答案 1 :(得分:0)
C++中的未定义行为。见标准中的5.4。
答案 2 :(得分:0)
运算符优先级控制操作数如何组合在一起以计算结果。它不一定控制应用副作用的顺序。
在C ++中,++
运算符都将在+
运算符之前计算(尽管这只会对++x
产生影响,因为x++
的值是与x
相同。递增x
的副作用发生在C ++中的下一个序列点之前,这就是我们所能说的,并且该表达式中唯一的序列点是在完全评估之后,包括赋值。此外,根据标准明确地未定义在序列点之间多次修改对象的结果。
给定未定义的行为,典型的实现将依赖于实现序列如何定义行为的细节,因此如果您坚持使用一个版本的一个编译器,通常会获得一致的结果。