Dies betrifft lWerte und rWerte in C und C ++.
In der Programmiersprache C geben sowohl die Operatoren vor als auch nach dem Inkrement r-Werte zurück, nicht l-Werte. Dies bedeutet, dass sie sich nicht auf der linken Seite des =
Zuweisungsoperators befinden können. Diese beiden Anweisungen geben einen Compilerfehler in C aus:
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 ++ gibt der Operator vor dem Inkrementieren jedoch einen Wert zurück , während der Operator nach dem Inkrementieren einen Wert zurückgibt. Dies bedeutet, dass ein Ausdruck mit dem Vorinkrementierungsoperator auf der linken Seite des =
Zuweisungsoperators platziert werden kann!
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
Warum ist das so? Das Nachinkrement erhöht die Variable und gibt die Variable wie zuvor zurück dem Inkrementieren war. Dies ist eigentlich nur ein Wert. Der frühere Wert der Variablen a wird als temporäres in ein Register kopiert und dann wird a inkrementiert. Aber der frühere Wert von a wird vom Ausdruck zurückgegeben, es ist ein r-Wert. Es repräsentiert nicht mehr den aktuellen Inhalt der Variablen.
Das Vorinkrement erhöht zuerst die Variable und gibt dann die Variable zurück, wie sie nach dem Inkrement geworden ist. In diesem Fall müssen wir den alten Wert der Variablen nicht in einem temporären Register speichern. Wir rufen nur den neuen Wert der Variablen ab, nachdem sie inkrementiert wurde. Das Vorinkrement gibt also einen l-Wert zurück, es gibt die Variable a selbst zurück. Wir können diesen Wert etwas anderem zuweisen, es ist wie in der folgenden Anweisung. Dies ist eine implizite Umwandlung von lvalue in rvalue.
int x = a;
int x = ++a;
Da das Vorinkrement einen l-Wert zurückgibt, können wir ihm auch etwas zuweisen. Die folgenden zwei Aussagen sind identisch. Bei der zweiten Zuweisung wird zuerst a inkrementiert, dann wird sein neuer Wert mit 2 überschrieben.
int a;
a = 2;
++a = 2; // Valid in C++.