运算符优先级,结果正确

Operator precedence, which result is correct?

本文关键字:结果 优先级 运算符      更新时间:2023-10-16

可能重复:
未定义的行为和序列点

这个代码之后x的值是多少?

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

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

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

在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

由于"先求值左手操作数",+(++x(的左操作数在右操作数之前完全求值。另请参阅上一个答案和本答案,关于类似的主题,以及到标准的链接。

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

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

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

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

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