Operator precedence, which result is correct?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Undefined behavior and sequence points
此代码之后,
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〕相同。增量
给定未定义的行为,典型的实现将做一些依赖于实现序列如何定义行为的细节的事情,因此如果坚持使用一个编译器的一个版本,通常会得到一致的结果。
它是C++中未定义的行为。见本标准5.4。