Perché “a +++++ b” non può essere compilato in gcc, ma “a +++ b”, “a ++ + ++ b” e “a +++ ++ b” possono essere?

Possibile duplicato:
Per favore aiutami a capire l’errore a +++++ b in C

Ecco il codice di esempio, perché “a +++++ b” non può essere compilato, ma altri possono essere?

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

Questo perché a+++++b viene analizzato come a ++ ++ + b e non come a ++ + ++ b [Il tokenizzatore di C è avido]. a++ restituisce un valore rvalue e non è ansible applicare ++ su un valore rval in modo da ottenere quell’errore.

 a+++b; // parsed as a ++ + b a+++ ++b; // parsed as a ++ + ++ b 

Leggi su Maximal Munch Rule.

Il compilatore è avido quindi la tua espressione

 a+++++b 

sarà inteso come

 a++ ++ +b 

Gli operatori + sono in cascata … con a+++++b , non c’è nessun valore-l (valore indirizzabile dalla memoria) da aggiungere dopo che le operazioni di aggiunta sono state sovrapposte.

In altre parole, a+++b è uguale a (a++) + b . Questa è un’operazione valida. Lo stesso vale per a+++ ++b che equivale a (a++) + (++b) . Ma con a+++++b , non lo ottieni tramite il parser C. Al parser sembra ((a++)++) + b , e dal momento che (a ++) restituisce un temp, non è un valore di l che può essere incrementato di nuovo tramite l’operatore ++ .

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