+ =运算符链接(带有少量UB)

时间:2011-01-24 16:31:16

标签: c pointers chaining undefined-behavior

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

或者可以简单地将其定义为未定义的行为?

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

结果:

i= 13

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:-3)

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

查找反向波兰表示法,了解有关此处发生的事情的提示。