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