我仍在努力思考以下表达式如何导致未定义的行为:
a = a++;
在对此进行搜索时,我发现了以下问题:
我通读了所有答案,但我仍然对细节有困难。其中一个答案将我上面的代码示例的行为描述为模棱两可,就如何a
修改而言。例如,它可能归结为以下任何一种:
a=(a+1);a++;
a++;a=a;
究竟是什么让a
' 的修改模棱两可?这是否与不同平台上的 CPU 指令有关,以及优化器如何利用未定义的行为?换句话说,由于生成的汇编程序,它似乎未定义?
我看不出编译器使用的理由a=(a+1);a++;
,它看起来很古怪而且没有多大意义。什么将拥有编译器使其行为如此?
编辑:
为了清楚起见,我确实了解正在发生的事情,但我只是不明白当有运算符优先级规则时(它本质上定义了表达式的评估顺序),它怎么可能是未定义的。在这种情况下,分配发生在最后,因此a++
需要首先进行评估,以确定要分配给的值a
。所以我期望的是a
在后修复增量期间首先修改它,然后产生一个值来分配回a
(第二次修改)。但是运算符优先级的规则似乎使我的行为非常清楚,我找不到任何“摆动空间”让它具有未定义的行为。