2010-02-03 28 views
6

Considere el fragmento follwoing:duda con respecto a los operadores en C/C++/Java

int a,b; 
a = 1; 
b = 2; 

c = a++++b; // does not work!! Compilation error. 
c = a++*+b; // works !! 

Por favor, me ayudan a entender este comportamiento.

+4

"Does not work" es inútilmente vago. Supone que hay un resultado esperado que representa "trabajos", y un resultado real que representa "no funciona", y usted no ha podido proporcionar ninguno. –

+6

¿Cuál es el punto? – Art

Respuesta

30
c = a++++b; 

se trata como:

c = ((a++)++)b; 

que es incorrecto, ya que usted está tratando de incrementar la no-valor-I.

y

c = a++*+b; 

se trata como:

c = (a++)*(+b); 

La causa de este comportamiento es: El analizador léxico lenguaje C es greedy.

En el caso 1: Después del token 'a' (identificador) el lexer ve +, seguido de otro +, por lo que consume ambos (como el operador de incremento) como parte del mismo token. No hace que la tercera + parte de la misma señal como +++ no sea un token válido. De manera similar, los grupos de los dos siguientes + ++ en token de lo que es efectivamente igual a:

c = ((a++)++)b; 

cual no es correcto como ++ no devolverá un valor-I, por lo tanto, no se puede aplicar a ++ en él. Algo similar a decir 5 ++;

Pero en el caso 2: el primer par de ++ se agruparán (como operador de incremento). A continuación, * solo será un token, ya que no puede combinarlo con a + ya que * + no es un token válido. Por último, el + será un símbolo (como unario +) hacer efectiva su estado de cuenta como:

c = (a++)*(+b); 

Puede anular este comportamiento codicioso del analizador léxico, haciendo uso de paréntesis o espacios en blanco de la siguiente manera:

c = a++ + +b; 
c = a++ * +b; 
+1

Gracias codaddict por la explicación elaborada. Siempre que tenga dudas sobre la agrupación de operadores, aplicaré esta regla de máximo consumo. – Zacky112

7

esto es efectivamente debido a la "maximum munch rule" en C.

c = a++++b; 

se analiza como c = a++ ++ b;, que es error de sintaxis.

c = a++*+b; 

se analiza como c = a++ * +b;, lo cual está bien.

Desde el proyecto C99, sección 6.4p4 (el énfasis es mío):

Si el flujo de entrada se ha analizado en el preprocesamiento fichas de hasta un carácter determinado, el siguiente token de procesamiento previo es la secuencia más larga de caracteres eso podría constituir un token de preprocesamiento.

+0

Gracias a Alok por darnos la referencia y la explicación. – Zacky112

0

operator precedence. ++ tiene una alta prioridad que binario +.

+2

No veo cómo podría ser la precedencia del operador. –

+0

c = a ++ + + b; está bien, pero si elimina los espacios en blanco, resulta ser un error lvalue no válido. – bhups

+0

Supongo que entendí mal el problema. gracias por la explicación. – bhups

0

precedance of ++ es igual a la precedencia de +. Entonces usamos de izquierda a derecha.

1

La misma razón por la que obtenemos un error en el C++ para:

vector<vector<int>>; 

El >> será tratado como un operador.

Cuestiones relacionadas