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

代码段是:

int main() { int a = 1, b = 2, c = 3; printf("%d", a += (a += 3, 5, a)); } 

虽然它在终端中显示8作为输出。 但我没有得到它背后的概念。

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

 a += (a += 3, 5, a) 

这首先计算a+=3 ,这使得a=4这个结果被丢弃,然后计算5然后这个结果被丢弃,然后评估a并保持这个,因为它是最后一个项目。 (a += 3, 5, a)是最后一项是4。

然后你得到

 a += 4 

所以a8

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

表达式a += (a += 3, 5, a)将调用未定义的行为。

C标准说

C11:6.5.16指配算子(p3):

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

不能保证在评估(a += 3, 5, a)之前或之后是否评估最左边的(a += 3, 5, a) 。 这将导致未定义的行为。