¿Cómo funciona el operador de coma durante la asignación?

int a = 1; int b = (1,2,3); cout << a+b << endl; // this prints 4 
  1. Es (1,2,3) algún tipo de estructura en c ++ (¿algún tipo de lista primitiva, tal vez?)
  2. ¿Por qué se le asigna a b el valor 3 ? ¿El comstackdor simplemente toma el último valor de la lista?

Sí, eso es exactamente: el comstackdor toma el último valor. Ese es el operador de coma, y ​​evalúa sus operandos de izquierda a derecha y devuelve el más a la derecha. También se resuelve de izquierda a derecha. Por qué alguien escribiría un código así, no tengo idea 🙂

Entonces int b = (1, 2, 3) es equivalente a int b = 3 . No es una lista primitiva de ningún tipo, y el operador de coma se usa principalmente para evaluar múltiples comandos en el contexto de una expresión, como a += 5, b += 4, c += 3, d += 2, e += 1, f por ejemplo.

(1,2,3) es una expresión que usa dos instancias del operador de coma. El operador de coma evalúa su operando izquierdo, luego hay un punto de secuencia y luego evalúa su operando derecho. El valor del operador de coma es el resultado de la evaluación del operando de la derecha, el resultado de evaluar el operando de la izquierda se descarta.

 int b = (1,2,3); 

es, por lo tanto, equivalente a:

 int b = 3; 

La mayoría de los comstackdores advertirán sobre este uso del operando de coma, ya que solo hay un punto para usar un operador de coma si la expresión de la mano izquierda tiene algún efecto secundario.

La segunda línea está utilizando el operador de coma. Una expresión como

 a, b 

evalúa a y b devuelve b .

En este caso, la segunda línea se analiza como:

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

por lo que (1, 2) se evalúa (a 2 ) y luego se tira, y el resultado final es simplemente 3.

Es el operador de coma el que toma la forma expr, expr . La primera expresión se evalúa y el resultado se descarta, la segunda expresión se evalúa y su resultado se devuelve.

En su caso esa línea se evalúa como:

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

probablemente solía ser b = foo (1,2,3) pero el foo se eliminó accidentalmente. C no se queja de este tipo de basura “es una característica”.