Ich habe gerade gelernt, dass das Ergebnis des Präfixinkrementoperators in C ++ ein Lvalue ist. Es gibt wahrscheinlich Fälle, in denen dieses Verhalten dem Programmierer hilft, effektiver zu sein, aber ich konnte mir keine vorstellen. Was sind einige idiomatische Verwendungen dieses Verhaltens des Präfixinkrementoperators?
Das Grundpräfix ++
liefert einen Lvalue ist Orthogonalität; Ich habe es nicht gesehen
jede Verwendung dafür, die nicht als Verschleierung gelten würde. Aber die Frage
is: Welche Regeln gelten, damit ein Ausdruck ein Lvalue ist? In C, der
Grundregel ist, dass Ausdrücke, die einen ihrer Operanden modifizieren, nicht sind
lvalues, aber eine Reihe von Leuten wollte Dinge unterstützen wie:
Dies funktioniert für benutzerdefinierte Typen (weil operator=
ein Mitglied ist
Funktion), und einige Mitglieder wollten es für eingebaute Typen unterstützen
Gut. Die Grundregel wurde also: wenn ein Operator einen lvalue benötigt
Operand, den es modifiziert, und die Ergebnisse des Betreibers waren die
Operand geändert, dann ist es ein Lvalue. (So, während Präfix ++
ist ein
Lvalue, Postfix ist nicht, weil die Ergebnisse des Ausdrucks nicht die sind
Operand geändert.)
Ich persönlich bin nicht sicher, ob ich dem zustimme. Ich habe kein Problem mit dem Ersetzen der oben mit:
%Vor% so würde ich es in meinem eigenen Code schreiben. Aber angesichts der ersten
Beispiel ist legal für benutzerdefinierte Typen (wobei operator=
zurückgibt
a T&
), und das scheint einer Anzahl von Ausschussmitgliedern gefallen zu haben
logisch, es zu den eingebauten Typen zu erweitern, und die resultierende Regel ist
kohärent, auch wenn niemand jemals die Gelegenheit hat, die
Ergebnisse des Präfix ++
als Lvalue.
BEARBEITEN:
Nur um es klar zu machen: Ich habe diese Frage in einem der
Meetings (als wir C ++ 98 definierten), und das war die
Antwort bekam ich (von, wenn ich mich recht erinnere, Andy Koenig, wer
arbeitete mit Stroustrup an den frühesten Implementierungen von C ++).
Es war auch die Rechtfertigung für den Ausfall
Implementierung von operator=
gibt T&
statt a zurück
T const&
.
Die Änderung von C wobei ++ x ein R-Wert zu C ++ ist, wobei ++ x für eingebaute Typen ein L-Wert ist, liegt wahrscheinlich daran, dass es viel nützlichere Anwendungen gibt. Zum Beispiel könnten Sie eine Funktion alternativ als
definieren %Vor%und die Tatsache, dass ++ x ein Lvalue ist, ermöglicht es Ihnen, f (++ x) aufzurufen; in beiden Fällen. In C war nur der erste Fall legal und funktioniert gut mit einem rvalue. In C ++ möchten Sie einen Lvalue.
Im obigen Fall verwenden wir den Präfixinkrementoperator, da Sie c zuerst i & gt; j überprüfen können, was in diesem Fall falsch ist, dann ordnen wir den Wert ++ i zu k zu, was uns k = 1 geben wird . Hier in einer einzigen Anweisung haben wir zweimal i verwendet, aber einmal war der Wert 9 und zu anderen Zeiten war der Wert 10. Wenn Sie versuchen, dies ohne Präfix-Inkrementoperator zu erreichen, müssten wir eine andere temporäre Variable verwenden, um den Wert von i zu speichern, dann inkrementiere ich, um k zuzuweisen. Ohne Verwendung des Präfixoperators
%Vor%Immer noch, wenn wir zu einer Bedingung kommen, bei der temp größer ist als j, dann wird der Wert von i erhöht, auch wenn wir ihn nicht verwenden. Mit dem Präfix-Operator tje wird der Wert von i nur erhöht, wenn i kleiner als j ist.