Consideriamo il seguente codice:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Si compila con il seguente con un errore:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Mi sembra giusto. L'incremento Postfix ha una priorità maggiore rispetto all'incremento del prefisso, quindi il codice viene analizzato come int b = ++(i++);
ed i
è un valore. Da qui l'errore.
Consideriamo ora questa variante con parentesi per sovrascrivere le priorità predefinite:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Questo codice viene compilato e restituito 3. Di per sé, questo suona giusto per me, ma sembra in contraddizione con il primo codice.
La domanda: perché (++i)
un lvalue
quando i
non lo è?
Grazie!
AGGIORNAMENTO: il messaggio di errore mostrato sopra era di gcc (x86-64 9.2). Ecco il rendering esatto: errore con gcc
Clang x86-64 9.0.0 ha un messaggio abbastanza diverso: errore con clang
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
Con GCC, hai l'impressione che il problema sia con l'operatore postfix e puoi quindi vagare perché ++i
va bene mentre i
non lo è, quindi la mia domanda. Con Clang è più chiaro che il problema riguarda l'operatore prefisso.