¿Por qué no funciona a+++++b?

Resuelto Barshan Das asked hace 13 años • 10 respuestas
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?

Barshan Das avatar Mar 17 '11 22:03 Barshan Das
Aceptado

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.

Lou Franco avatar Apr 15 '2011 13:04 Lou Franco

printf("%d",a+++++b);¡Se interpreta (a++)++ + bsegún la regla Munch Munch ! .

++(postfix) no se evalúa como an lvaluepero 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"

Prasoon Saurav avatar Mar 17 '2011 15:03 Prasoon Saurav