Dotyczy to wartości i wartości w C i C ++.
W języku programowania C zarówno operatory wstępnej, jak i końcowej operacji zwracają wartości, a nie wartości. Oznacza to, że nie mogą znajdować się po lewej stronie =operatora przypisania. Obie te instrukcje spowodują błąd kompilatora w C:
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
Jednak w C ++ operator wstępnej inkrementacji zwraca wartość , podczas gdy operator po inkrementacji zwraca wartość. Oznacza to, że wyrażenie z operatorem wstępnego przyrostu można umieścić po lewej stronie =operatora przypisania!
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
Dlaczego tak jest? Post-increment inkrementuje zmienną i zwraca zmienną taką, jaka była wcześniej inkrementacją. To właściwie tylko wartość. Poprzednia wartość zmiennej a jest tymczasowo kopiowana do rejestru, a następnie jest zwiększana. Ale poprzednia wartość a jest zwracana przez wyrażenie, jest to wartość. Nie reprezentuje już bieżącej zawartości zmiennej.
Wstępna inkrementacja najpierw inkrementuje zmienną, a następnie zwraca zmienną taką, jaka była po inkrementacji. W takim przypadku nie musimy przechowywać starej wartości zmiennej w rejestrze tymczasowym. Po prostu pobieramy nową wartość zmiennej po jej zwiększeniu. Tak więc przyrost wstępny zwraca wartość, zwraca samą zmienną. Możemy użyć przypisania tej wartości do czegoś innego, to jest jak poniższa instrukcja. Jest to domyślna konwersja wartości do wartości.
int x = a;
int x = ++a;
Ponieważ wstępny przyrost zwraca wartość, możemy również mu coś przypisać. Poniższe dwa stwierdzenia są identyczne. W drugim zadaniu najpierw zwiększa się a, a następnie nową wartość zastępuje 2.
int a;
a = 2;
++a = 2; // Valid in C++.