运算符优先级,哪个结果是正确的?

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

此代码后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。

链接地址: http://www.djcxy.com/p/73225.html

上一篇: Operator precedence, which result is correct?

下一篇: Pre & post increment operator behavior in C, C++, Java, & C#