Ciò riguarda i valori e i valori in C e C ++.
Nel linguaggio di programmazione C, sia l'operatore pre-incremento che quello post-incremento restituiscono valori, non valori. Ciò significa che non possono trovarsi sul lato sinistro =
dell'operatore di assegnazione. Entrambe queste istruzioni daranno un errore del compilatore in C:
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
In C ++, tuttavia, l'operatore pre-incremento restituisce un valore , mentre l'operatore post-incremento restituisce un valore. Significa che un'espressione con l'operatore di pre-incremento può essere posizionata sul lato sinistro =
dell'operatore di assegnazione!
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
Ora, perché è così? Il post-incremento incrementa la variabile e restituisce la variabile com'era prima dell'incremento. Questo è in realtà solo un valore. Il valore precedente della variabile a viene copiato in un registro come temporaneo, quindi viene incrementato. Ma il valore precedente di a viene restituito dall'espressione, è un valore. Non rappresenta più il contenuto corrente della variabile.
Il pre-incremento incrementa prima la variabile, quindi restituisce la variabile come è diventata dopo l'incremento. In questo caso, non è necessario archiviare il vecchio valore della variabile in un registro temporaneo. Recuperiamo semplicemente il nuovo valore della variabile dopo che è stata incrementata. Quindi il pre-incremento restituisce un valore, restituisce la variabile a se stessa. Possiamo usare assegnare questo valore a qualcos'altro, è come la seguente affermazione. Questa è una conversione implicita di lvalue in rvalue.
int x = a;
int x = ++a;
Poiché il pre-incremento restituisce un valore, possiamo anche assegnargli qualcosa. Le seguenti due affermazioni sono identiche. Nella seconda assegnazione, prima a viene incrementato, quindi il suo nuovo valore viene sovrascritto con 2.
int a;
a = 2;
++a = 2; // Valid in C++.