运算符优先级,结果是否正确?

时间:2011-04-06 18:25:29

标签: java c++ operator-precedence

  

可能重复:
   Undefined behavior and sequence points

此代码后x的价值是多少?

int x = 5;
x = ++x + x++;

在Java中,结果是12,但在C ++中,结果是13。

我用Google搜索了Java和C ++的运算符优先级,它们看起来一样。那么为什么结果不同呢?是因为编译器吗?

3 个答案:

答案 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 answerthis one,其中包含指向该标准的链接。

在C ++中,它是未定义的行为,因为你在没有干预sequence point的情况下修改x三次。

答案 1 :(得分:0)

C++中的未定义行为。见标准中的5.4。

答案 2 :(得分:0)

运算符优先级控制操作数如何组合在一起以计算结果。它不一定控制应用副作用的顺序。

在C ++中,++运算符都将在+运算符之前计算(尽管这只会对++x产生影响,因为x++的值是与x相同。递增x的副作用发生在C ++中的下一个序列点之前,这就是我们所能说的,并且该表达式中唯一的序列点是在完全评估之后,包括赋值。此外,根据标准明确地未定义在序列点之间多次修改对象的结果。

给定未定义的行为,典型的实现将依赖于实现序列如何定义行为的细节,因此如果您坚持使用一个版本的一个编译器,通常会获得一致的结果。