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

int a = 1; int b = (1,2,3); cout << a+b << endl; // this prints 4 
  1. (1,2,3)是c ++中的某种结构(某种原始类型的列表,也许?)
  2. 为什么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 

评估ab并返回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不会抱怨这种废话“这是一个特色”。