¿Por qué no funciona a+++++b?
int main ()
{
int a = 5,b = 2;
printf("%d",a+++++b);
return 0;
}
Este código da el siguiente error:
error: valor l requerido como operando incremental
Pero si pongo espacios en todas partes a++ +
y ++b
, entonces funciona bien.
int main ()
{
int a = 5,b = 2;
printf("%d",a++ + ++b);
return 0;
}
¿Qué significa el error en el primer ejemplo?
Los compiladores se escriben en etapas. La primera etapa se llama lexer y convierte a los personajes en una estructura simbólica. Entonces "++" se convierte en algo así como enum SYMBOL_PLUSPLUS
. Más tarde, la etapa del analizador convierte esto en un árbol de sintaxis abstracta, pero no puede cambiar los símbolos. Puede afectar el lexer insertando espacios (que terminan en símbolos a menos que estén entre comillas).
Los lexers normales son codiciosos (con algunas excepciones), por lo que su código se interpreta como
a++ ++ +b
La entrada al analizador es un flujo de símbolos, por lo que su código sería algo como:
[ SYMBOL_NAME(name = "a"),
SYMBOL_PLUS_PLUS,
SYMBOL_PLUS_PLUS,
SYMBOL_PLUS,
SYMBOL_NAME(name = "b")
]
Lo que el analizador considera sintácticamente incorrecto. (EDITAR basado en comentarios: Semánticamente incorrecto porque no se puede aplicar ++ a un valor r, lo que da como resultado a++)
a+++b
es
a++ +b
Lo cual está bien. También lo son sus otros ejemplos.
printf("%d",a+++++b);
¡Se interpreta (a++)++ + b
según la regla Munch Munch ! .
++
(postfix) no se evalúa como an lvalue
pero requiere que su operando sea an lvalue
.
! 6.4/4 dice que el siguiente token de preprocesamiento es la secuencia más larga de caracteres que podría constituir un token de preprocesamiento"