逗号运算符在赋值期间如何工作?
int a = 1; int b = (1,2,3); cout << a+b << endl; // this prints 4
-
(1,2,3)
是c ++中的某种结构(某种原始类型的列表,也许?) - 为什么
b
的值为3
? 编译器是否只是从列表中取出最后一个值?
是的,就是这样:编译器获取最后一个值。 这是逗号运算符,它从左到右评估其操作数并返回最右边的操作数。 它也从左到右解决。 为什么有人会写这样的代码,我不知道:)
所以int b = (1, 2, 3)
相当于int b = 3
。 它不是任何类型的原始列表,逗号运算符主要用于在一个表达式的上下文中评估多个命令,如a += 5, b += 4, c += 3, d += 2, e += 1, f
例如a += 5, b += 4, c += 3, d += 2, e += 1, f
。
(1,2,3)
是使用逗号运算符的两个实例的表达式。 逗号运算符计算其左操作数,然后是一个序列点,然后它计算它的右操作数。 逗号运算符的值是右手操作数的计算结果,评估左操作数的结果被丢弃。
int b = (1,2,3);
因此,相当于:
int b = 3;
大多数编译器会警告这样使用逗号操作数,因为如果左手表达式有一些副作用,则只使用逗号运算符。
第二行是使用逗号运算符。 一个表达式
a, b
评估a
和b
并返回b
。
在这种情况下,第二行解析如下:
int b = ((1, 2), 3);
所以(1, 2)
被评估(到2
)然后扔掉,最终结果就是3。
它是逗号运算符,其forms为expr, expr
。 计算第一个表达式并丢弃结果,计算第二个表达式并返回其结果。
在您的情况下,该行被评估为:
((1, 2), 3) => (2, 3) => 3
它可能曾经是b = foo(1,2,3),但foo被意外删除了。 C不会抱怨这种废话“这是一个特色”。