int a = 1;
int b = (1,2,3);
cout << a+b << endl; // this prints 4
(1,2,3)
是c ++中的某种结构(可能是某种原始类型的列表?)b
分配了值3
?编译器是否只是从列表中取出最后一个值?答案 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
评估a
和b
并返回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不会抱怨这种废话“这是一个特色”。