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++定义事物的方式。