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