2011-12-23 17 views
9
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 primitivo de la lista, tal vez?)
  2. b ¿Por qué se le asigna el valor 3? ¿El compilador simplemente toma el último valor de la lista?
+1

No hay lógica detrás de ese código. Es algo que haría un maestro para poner a prueba tu comprensión del operador de coma. Use la [tarea] cuando sea apropiado. –

+0

o es un error tipográfico. Es decir (1,2,3) no es lo que el autor del código pretendía. – ddyer

+0

posible duplicado de [¿Qué hace el operador de coma \ ', \' hacer en C?] (Http: // stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c) –

Respuesta

8

Sí, eso es exactamente: el compilador 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 ni 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 varios comandos en el contexto de una expresión, como a += 5, b += 4, c += 3, d += 2, e += 1, f, por ejemplo.

+4

El único buen uso (más o menos) está dentro del for (;; ++ x, ++ y) –

+0

@LokiAstari: Sip. (Me acabo de dar cuenta - por "¿Por qué alguien escribiría un código así, no tengo ni idea?" Me refería a '(1, 2, 3)' que es inútil. El operador de coma está bien en otros casos ':)') – Ryan

+0

La única razón posible (no necesariamente buena) en la que puedo pensar sería unir un conjunto de operaciones en las que no te importan los resultados de cada una. [ejemplo] (http://ideone.com/MuwxQ). * editar: * y Loki sería otro. – FakeRainBrigand

6

(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 mano 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; 

mayoría de los compiladores le advertirá acerca de un uso del operando por comas, como hay solo un punto para el uso de un operador coma si la expresión de la izquierda tiene algún efecto secundario.

1

Es el operador de coma 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 se devuelve su resultado.

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

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

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

a, b 

evalúa tanto a y b y devuelve b.

En este caso, la segunda línea es analizada como:

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

así se evalúa (1, 2) (a 2) a continuación, tirado, y el resultado final es simplemente 3.

-3

probablemente usado para be b = foo (1,2,3) pero el foo se eliminó accidentalmente. C no se queja de este tipo de basura "es una característica".

+0

Creo que aquellos de ustedes que están hojeando esta respuesta están perdiendo un punto importante. Nadie escribiría este código. Si el interlocutor intenta comprender este código, debe comprender que tampoco es lo que el autor realmente pretendió. – ddyer

Cuestiones relacionadas