我有这个代码:
int main()
{
int a=1,b=2,c=3;
printf("%d\n",a+=(a+=3,5,a));
return 0;
}
结果打印8
。这怎么可能?
第1步中,取出a+=3
后,a=a+3变为a=4
在第 2 步中,a+=(a+=3)
我到达了 a=a+(4)
,因此 a=4+4=8
。这样移动我没有成功使 a+=(a+=3,5,a)
等于 8。
最佳答案
逗号运算符既是一个序列点,又定义了求值顺序(如 C 规范第 6.5.17 节中所述)。该运算符计算左侧操作数,然后计算右侧操作数并生成右侧操作数的值。
让我们来分解一下:
(a+=3,5,a)
这会将 a 加 3,然后得出右手的值,即:
5, a
它将把 5 评估为 5,然后丢弃它。然后它将评估 a
,然后产生值 a
(即 4)。剩下的就变成了:
a+=4
将 4 添加到 a
,然后生成 a
的新值,即 8。
注意:这可能是未定义的行为,请参阅下面 Vlad 的回答。
关于c - 棘手的表达式评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215686/