bitwise - operator pelicula
¿Por qué "a+++++ b" no se puede compilar en gcc, pero "a+++ b", "a+++++ b" y "a+++++ b" pueden ser? (4)
Posible duplicado:
Por favor, ayúdame a entender el error a +++++ b en C
Aquí está el código de muestra, ¿por qué "a +++++ b" no se puede compilar, pero otros pueden ser?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int a = 0;
int b = 0;
int c = 0;
c = a+++b;
printf("a+++b is: %d/n", c);
c = a = b = 0;
c = a++ + ++b;
printf("a++ + ++b is: %d/n", c);
c = b = a = 0;
c = a+++ ++b;
printf("a+++ ++b is: %d/n", c);
c = b = a = 0;
c = a+++++b; // NOTE: Can not be compiled here.
printf("a+++++b is: %d/n", c);
return 0;
}
El compilador es codicioso, entonces tu expresión
a+++++b
se entenderá como
a++ ++ +b
Eso es porque a+++++b
se analiza como a ++ ++ + b
y no como a ++ + ++ b
[El tokenizador de C es codicioso]. a++
devuelve un valor r y no puede aplicar ++
en un valor r para obtener ese error.
a+++b; // parsed as a ++ + b
a+++ ++b; // parsed as a ++ + ++ b
Lea sobre Maximal Munch Rule.
Los +
operadores en cascada ... con a+++++b
, no hay valor l (valor direccionable de la memoria) para agregar en contra después de que las operaciones de adición estén en cascada.
Dicho de otra manera, a+++b
es lo mismo que (a++) + b
. Esa es una operación válida. Lo mismo es cierto con a+++ ++b
que equivale a (a++) + (++b)
. Pero con a+++++b
, no obtienes eso a través del C-analizador. Para el analizador, parece ((a++)++) + b
, y como (a ++) devuelve una temperatura, no es un valor l que pueda incrementarse nuevamente a través del operador ++
.
# include <stdio.h>
# include <stdlib.h>
int main(int argc, char **argv)
{
int a = 0;
int b = 0;
int c = 0;
c = a+++b;
printf("a+++b is: %d/n", c);
c = a = b = 0;
c = (a++)+(++b);
printf("a++ + ++b is: %d/n", c);
c = b = a = 0;
c = (a++)+(++b);
printf("a+++ ++b is: %d/n", c);
c = b = a = 0;
c = (a++)+(++b);
printf("a+++++b is: %d/n", c);
return 0;
}