我知道分号之前没有序列点,但是对于取消引用的指针在表达式中使用旧值 2 是否有合理的解释?
还是可以简单地将其归结为未定义的行为?
int i=2;
int *x=&i;
*x+=*x+=i+=7;
结果:
i= 13
我知道分号之前没有序列点,但是对于取消引用的指针在表达式中使用旧值 2 是否有合理的解释?
还是可以简单地将其归结为未定义的行为?
int i=2;
int *x=&i;
*x+=*x+=i+=7;
结果:
i= 13
这是“简单”的未定义行为。
也就是说,编译器可能发出的代码读取i
一次的值然后执行所有算术运算,然后存储 的新值i
。
找出真正解释的明显方法是查看编译器生成的程序集。
行为不是未定义的,它取决于编译器分解表达式并将中间结果推入堆栈的方式。首先计算两个*x
s(都等于 2)并压入堆栈。然后i
将 7 添加到它并等于 9。然后将*x
仍然等于 2 的第二个从堆栈中拉出,并添加到 11。然后将第一个*x
从堆栈中拉出并添加到 11 中以形成 13。
查找反向波兰表示法以获取有关此处发生的情况的提示。