2011-12-15 15 views
5

Tengo tres fragmentos de código. Este:¿Por qué esta inicialización doble con una coma es ilegal?

1,7; //yes, that's all the code 

compila bien. Este:

double d = (1, 7); 

también compila bien. Sin embargo, este:

double d = 1, 7; 

no se compila. gcc-4.3.4 dice

error: expected unqualified-id before numeric constant

y Visual C++ 10 dice

error C2059: syntax error : 'constant'

Por qué esa diferencia? ¿Por qué los tres no compilan con , teniendo el mismo efecto en los tres?

+3

creo que la gramática sería realmente muy peludas para tratar el 'doble d = 1, 7;' como una sola declarador, con '1, 7' como la expresión de inicialización, mientras que el tratamiento de' doble d = 1, e = 7; 'como dos declaradores. ¿O iría aún más lejos, y diría que si ya hay un alcance 'e' entonces 'doble d = 1, e = 7;' debería * también * ser tratado como un único declarador, con la expresión de inicializador '1, e = 7'? Veo un gran potencial de confusión, solo para guardar escribiendo un par de parens en el caso 'double d = (1, 7);' que de todos modos no tiene sentido. –

Respuesta

13

En los dos primeros casos, los estados están utilizando C++ 's comma operator

En este último caso, la coma se utiliza como separada variable y el compilador que está a la espera de declarar múltiples identificadores; la coma no se usa como operador aquí.

El último caso es similar a algo como:

float x,y; 
float a = 10, b = 20; 

Al hacer esto:

double d = 1, 7; 

El compilador espera un identificador de variable y no una constante numérica. Por lo tanto, 7 es ilegal aquí.

Sin embargo al hacer esto:

double d = (1,7); 

normal de operación coma se utiliza: 1 se evalúa y se descarta mientras que el 7 se almacena en d.

+0

+1: Sí, la respuesta es esencialmente "porque la gramática lo dice". –

+5

"el operador de coma no se está utilizando de la forma en que normalmente es", para ser precisos, ese token de coma no es el operador de coma en absoluto. Es un separador entre dos declaradores, y '7' no es un declarante válido. –

+0

Gracias Steve. Actualizado mi respuesta :-) – sharjeel

0

creo que es debido a que el último es tratado como línea (incorrecta) Declaración: (double d = 1), (7)

+0

Si ese fuera el caso, debería compilar, al igual que 1,7; hace. – Nikodemus

+0

1,7; es básicamente una declaración muy simple, por lo que está permitido por el compilador ... Su última línea es una declaración incorrecta. – DejanLekic

+0

La línea se trata como 'doble (d = 1), (7);' y como una variable no puede comenzar con un número 'doble 7' es un error de sintaxis –

5

La diferencia es que en 1, 7; y (1, 7) tiene expresiones en donde se permite que un operador coma.

Su último ejemplo

double d = 1, 7; 

es una declaración, en el que el coma no es un operador, sino un separador. El compilador exepta algo como

double d = 1, e = 7; 

que sería una declaración de variable correcta.

Tenga en cuenta que la coma es a veces un operador (en expresiones), pero también se utiliza como un separador en otros lugares como listas de parámetros en declaraciones de funciones.

3
  1. double d = (1, 7); Aquí el (1, 7) serán evaluados primero; la coma funciona como operador de evaluación secuencial y 7 se asignará a d.

  2. double d = 1, 7; En este caso no es un problema: la parte antes significa la coma se declara una doble y establece su valor, pero la parte después de la coma es sentido, porque es sólo un único constante entera .

Cuestiones relacionadas