Dev*_*aur 4 c undefined-behavior
代码段是:
int main()
{
int a = 1, b = 2, c = 3;
printf("%d", a += (a += 3, 5, a));
}
Run Code Online (Sandbox Code Playgroud)
虽然它在终端中显示8作为输出.但我没有得到它背后的概念.
hac*_*cks 10
表达式a += (a += 3, 5, a)将调用未定义的行为.
C标准说
[...]在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.
无法保证a在评估之前或之后是否评估最左侧(a += 3, 5, a).这将导致未定义的行为.
这是逗号运算符的工作方式,最后一个元素是用作语句值的元素.基本上你在这里得到的是以下内容:
a += (a += 3, 5, a)
Run Code Online (Sandbox Code Playgroud)
这a+=3首先进行评估,这会使a=4这个结果被丢弃,然后评估5然后丢弃这个结果,然后评估a并保持这个,因为它是最后一项.结果(a += 3, 5, a)是最后一项是4.
然后你得到
a += 4
Run Code Online (Sandbox Code Playgroud)
所以a是8.
重要说明:这是编译器生成代码的工件.a在这种情况下,C标准不保证赋值的执行顺序.有关详细信息,请参阅haccks答案.