traduccion pelicula operator bitwise c gcc operators

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; }