0

我知道分号之前没有序列点,但是对于取消引用的指针在表达式中使用旧值 2 是否有合理的解释?

还是可以简单地将其归结为未定义的行为?

int i=2;
int *x=&i;
*x+=*x+=i+=7;

结果:

i= 13
4

2 回答 2

7

这是“简单”的未定义行为。

也就是说,编译器可能发出的代码读取i一次的值然后执行所有算术运算,然后存储 的新值i

找出真正解释的明显方法是查看编译器生成的程序集。

于 2011-01-24T16:33:06.313 回答
-3

行为不是未定义的,它取决于编译器分解表达式并将中间结果推入堆栈的方式。首先计算两个*xs(都等于 2)并压入堆栈。然后i将 7 添加到它并等于 9。然后将*x仍然等于 2 的第二个从堆栈中拉出,并添加到 11。然后将第一个*x从堆栈中拉出并添加到 11 中以形成 13。

查找反向波兰表示法以获取有关此处发生的情况的提示。

于 2011-01-24T16:40:30.150 回答