为了打印"a"的值,内部(a + = 3,5,a)的操作数将如何处理或计算?

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标准说

C11:6.5.16指配算子(p3):

[...]在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.

无法保证a在评估之前或之后是否评估最左侧(a += 3, 5, a).这将导致未定义的行为.

  • 歧义不是逗号运算符的结果,而是"a"的最终赋值.它相当于`a + =(a + = 3)`,根据引用标准haccks的部分,它具有未定义的行为 (3认同)
  • 实际上,您将逗号分隔符(用于分离函数参数)与逗号运算符(实际上是已排序的)混淆... OP情况不是未定义的行为,虽然乍一看似乎是这样......在这种特殊情况下,在最右边的a之前,将评估括号中最左边的a.有关详细信息.http://en.wikipedia.org/wiki/Comma_o​​perator (2认同)

shu*_*e87 6

这是逗号运算符的工作方式,最后一个元素是用作语句值的元素.基本上你在这里得到的是以下内容:

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)

所以a8.

重要说明:这是编译器生成代码的工件.a在这种情况下,C标准不保证赋值的执行顺序.有关详细信息,请参阅haccks答案.

  • 好的除了小修正:`(a + = 3,5,a)`的结果是_last_项,虽然这里的结果是相同的(`a`) (4认同)