为了打印“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
所以a
是8
。
重要说明 :这是编译器生成代码的工件。 在这种情况下,C标准不保证分配给a
的执行顺序。 有关详细信息,请参阅haccks答案。
表达式a += (a += 3, 5, a)
将调用未定义的行为。
C标准说
C11:6.5.16指配算子(p3):
[…]在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序。 对操作数的评估是不确定的 。
不能保证在评估(a += 3, 5, a)
之前或之后是否评估最左边的(a += 3, 5, a)
。 这将导致未定义的行为。