关于java:运算符优先级,结果是否正确?

Operator precedence, which result is correct?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Undefined behavior and sequence points

此代码之后,x的值是多少?

1
2
int x = 5;
x = ++x + x++;

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

我搜索了JAVA和C++两个操作符的优先级,它们看起来是一样的。那么,为什么结果不同呢?是因为编译器吗?


在Java中,它被定义为评估为12。它的评估如下:

1
2
3
4
x = ++x + x++;
x = 6 + x++; // x is now 6
x = 6 + 6; // x is now 7
x = 12 // x is now 12

由于首先计算左手操作数,因此在右操作数之前完全计算EDOCX1的左操作数(+0])(+x)。另请参阅前面的答案和这个关于类似主题的答案,以及到标准的链接。

在C++中,它是未定义的行为,因为您在没有插入序列点的情况下修改x三次。


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

在C++中,EDCOX1的1个运算符都将在EDCOX1×0Ω操作符之前计算(尽管这仅在EDCOX1×3)中产生了差异,因为EDCOX1〔4〕的值与EDCOX1〔5〕相同。增量x的副作用发生在C++中的下一个序列点之前,这就是我们所能说的,并且该表达式中的唯一序列点是在它被完全赋值之后,包括赋值。此外,根据标准,在序列点之间多次修改对象的结果是明确未定义的。

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


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