2011-09-20 16 views
30

El código siguiente tiene me confundido¿Qué significa la operación c = a +++ b?

int a=2,b=5,c; 
c=a+++b; 
printf("%d,%d,%d",a,b,c); 

que esperaba que la salida sea 3,5,8, principalmente porque significa un ++ 2 1 que es igual a 3, y 3 + 5 es igual a 8, por lo que espera 3, 5,8. Resulta que el resultado es 3,5,7. ¿Alguien puede explicar por qué es este el caso?

+8

'a ++' ciertamente no significa '2 + 1'. :) – jalf

+1

estos son solo ejercicios en un libro, pero me hicieron pensar. ¡Los sigo equivocando! Así que no es código de producción ni nada – user595985

+0

A menos que estés escribiendo un compilador/analizador C++, nunca deberías escribir/pensar sobre expresiones como 'a +++ b', que alguien leerá el código más tarde podría interpretarse fácilmente como 'a + (++ b)' que evaluaría a 8. Los espacios y paréntesis son gratuitos y harán que la vida de todos sea más fácil en este caso. –

Respuesta

87

Se analiza como c = a++ + b, y a++ significa post-incremento, es decir, incremento después de tomar el valor de a para calcular a + b == 2 + 5.

Por favor, nunca escriba como este.

+2

¿Y cuál es la regla que establece que se analiza como 'a ++ + b', y no como' a + ++ b'? El tokenizer es codicioso? –

+1

Supongo que debe ser estrictamente asociativo a la izquierda. – Patrick87

+0

@BlagovestBuyukliev: revisa tu gramática C local o [ésta] (http://www.lysator.liu.se/c/ANSI-C-grammar-y.html). –

6

a ++ es posterior incremental, es decir, la expresión toma el valor de un y luego añade 1.
C++ = a + b haría lo que espera.

1

a ++ se evalúa después de la expresión.

c = ++ a + b; te daría lo que pensabas

2

Este es un ejemplo de mal estilo de programación.

Es bastante ilegible, sin embargo, enviar incrementos a por lo que resume el valor actual de a a b y después incrementa a!

1

El operador de incremento posterior, a ++, cambia el valor de t a después de que se evalúa el valor de a en la expresión. Como el valor original de a es 2, eso es lo que se usa para calcular c; el valor de a se cambia para reflejar el nuevo valor después de que se evalúa ++.

1

a ++ + b aparcarte da el resultado 7 y después de la expresión de valor de a es de actualización a 3 debido a que el operador de post incremento

+0

a ++ + b evalúa a 7, no a 5. Piense antes de responder. –

+0

@ desprado07 gracias por la corrección: D –

39

Maximal Munch Rule se aplica a dicha expresión, según la cual, la expresión se analiza como :

c = a++ + b; 

Esto es, a se incrementa post (a++) y así el valor actual de a (antes de incremento posterior) se toma para + operación con b.

+10

+1 por saber que esto se llama "maximal munch!" –

1

Según la regla Longest Match, se analiza como ++ ++ durante la fase de análisis léxico del compilador. De ahí la salida resultante.

Cuestiones relacionadas