I'm still trying to wrap my head around how the following expression results in undefined behavior:

a = a++;

Upon searching SO about this, I found the following question:

Difference between sequence points and operator precedence? 0_o

我通读了所有答案,但仍无法获得详细信息。答案之一将我的上述代码示例的行为描述为如何修改a模棱两可。例如,它可能归结为以下任何一个:

a=(a+1);a++;
a++;a=a;

是什么使a的修改模棱两可?这是否与不同平台上的CPU指令有关,优化器如何利用未定义的行为?换句话说,由于生成了汇编程序,它似乎未定义?

我看不出编译器使用a=(a+1);a++;的理由,它看起来很古怪,没有多大意义。什么将拥有编译器以使其具有这种行为?

编辑:

明确地说,我确实了解发生了什么,我只是不了解当存在关于运算符优先级的规则时(如何定义表达式的求值顺序),如何将其不确定。在这种情况下,分配最后发生,因此需要首先评估a++,以确定要分配给a的值。因此,我期望的是在后固定增量期间先修改a,然后再生成一个值以分配回a(第二个修改)。但是运算符优先级的规则似乎使行为对我来说非常清晰,我无法找到哪里有任何“摆动空间”使其具有未定义的行为。

最佳答案

The first answer in the question you linked to解释了到底发生了什么。我将尝试重新措辞以使其更加清晰。

运算符优先级定义了通过表达式计算值的顺序。表达式(a++)的结果是众所周知的。

但是,对变量a的修改不是表达式的一部分。对真的。这是您难以理解的部分,但这只是C和C++对其定义的方式。

表达式产生值,但某些表达式可能会产生副作用。表达式a = 1的值为1,但它还有将变量a设置为1的副作用。至于C和C++如何定义事物,这是两个不同的步骤。同样,a++具有一个值和一个副作用。

序列点定义副作用在这些序列点之后求值的表达式何时可见。运算符优先级与序列点无关。这就是C/C++定义事物的方式。

10-04 16:28