(a += 3, 5, a) 中的操作数将如何处理或计算以打印 "a" 的值?
How will be operands inside (a += 3, 5, a) are going to dealt or caculated in order to print the value of "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
的执行顺序。有关详细信息,请参阅骇客回答。
表达式a += (a += 3, 5, a)
将调用未定义的行为。
C 标准说
C11:6.5.16 赋值运算符(p3):
[...] The side effect of updating the stored value of the left operand is
sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced.
不保证最左边的a
会在(a += 3, 5, a)
的求值之前或之后被求值。这将导致未定义的行为。
我们知道逗号作为运算符的优先级最低,所以,
a + = (a + = 3, 5, a) 在这将发生的是第一次评估将是这样的 a+3 = 4但随后 它将被丢弃 现在评估将是 a+5 = 6 现在在 第三步我们必须做 a+ a 对
所以这里的答案将是之前操作的值,即 6 然后
6+1 = 7 现在我们从括号中出来,我们将做 a = a+ 7 这是
a = 1 + 7 所以答案是 8
因此 (a += 3,5,a) 会得到 7 和 a = a + 7 会得到你 8 最终会被打印出来
代码片段是:
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
的执行顺序。有关详细信息,请参阅骇客回答。
表达式a += (a += 3, 5, a)
将调用未定义的行为。
C 标准说
C11:6.5.16 赋值运算符(p3):
[...] The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced.
不保证最左边的a
会在(a += 3, 5, a)
的求值之前或之后被求值。这将导致未定义的行为。
我们知道逗号作为运算符的优先级最低,所以, a + = (a + = 3, 5, a) 在这将发生的是第一次评估将是这样的 a+3 = 4但随后 它将被丢弃 现在评估将是 a+5 = 6 现在在 第三步我们必须做 a+ a 对 所以这里的答案将是之前操作的值,即 6 然后 6+1 = 7 现在我们从括号中出来,我们将做 a = a+ 7 这是 a = 1 + 7 所以答案是 8 因此 (a += 3,5,a) 会得到 7 和 a = a + 7 会得到你 8 最终会被打印出来