Praktische Anwendung der Tatsache, dass der C ++ - Präfix-Inkrementoperator einen Lvalue [closed] zurückgibt

8

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?

    
AlwaysLearning 15.12.2014, 15:03
quelle

3 Antworten

6

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:

%Vor%

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& .

    
James Kanze 15.12.2014 16:06
quelle
4

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.

    
gnasher729 15.12.2014 15:23
quelle
0
%Vor%

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.

    
varun 15.12.2014 15:22
quelle

Tags und Links