逗号运算符在赋值期间如何工作?

时间:2011-12-23 20:46:18

标签: c

int a = 1;
int b = (1,2,3);
cout << a+b << endl; // this prints 4
  1. (1,2,3)是c ++中的某种结构(可能是某种原始类型的列表?)
  2. 为什么b分配了值3?编译器是否只是从列表中取出最后一个值?

5 个答案:

答案 0 :(得分:8)

是的,就是这样:编译器获取最后一个值。这是逗号运算符,它从左到右评估其操作数并返回最右边的操作数。它也从左到右解决。为什么有人会编写这样的代码,我不知道:)

因此int b = (1, 2, 3)相当于int b = 3。它不是任何类型的原始列表,逗号运算符,主要用于在一个表达式的上下文中评估多个命令,例如a += 5, b += 4, c += 3, d += 2, e += 1, f

答案 1 :(得分:6)

(1,2,3)是一个使用逗号运算符的两个实例的表达式。逗号运算符计算其左操作数,然后是一个序列点,然后计算其右操作数。逗号运算符的值是右手操作数的计算结果,左操作数的计算结果将被丢弃。

int b = (1,2,3);
因此,

相当于:

int b = 3;

大多数编译器会警告这样使用逗号操作数,因为如果左手表达式有一些副作用,那么只使用逗号运算符。

答案 2 :(得分:4)

第二行是使用逗号运算符。像

这样的表达式
a, b

评估ab并返回b

在这种情况下,第二行解析如下:

int b = ((1, 2), 3);

所以评估(1, 2)2)然后扔掉,结果只是3。

答案 3 :(得分:1)

它是逗号运算符,其格式为expr, expr。计算第一个表达式并丢弃结果,计算第二个表达式并返回其结果。

在您的情况下,该行评估为:

((1, 2), 3) =>
(2, 3) =>
3

答案 4 :(得分:-3)

它可能曾经是b = foo(1,2,3),但foo被意外删除了。 C不会抱怨这种废话“这是一个特色”。