webentwicklung-frage-antwort-db.com.de

Unterschiedliches Verhalten des Kommaoperators in C ++ mit Rückgabe?

Dies (beachten Sie den Komma-Operator):

#include <iostream>
int main() {
    int x;
    x = 2, 3;
    std::cout << x << "\n";
    return 0;
}

ausgänge 2.

Wenn Sie jedoch return mit dem Kommaoperator verwenden, geschieht Folgendes:

#include <iostream>
int f() { return 2, 3; }
int main() {
    int x;
    x = f();
    std::cout << x << "\n";
    return 0;
}

ausgänge .

Warum verhält sich der Kommaoperator bei return anders?

80
ps95

Entsprechend der Operator-Priorität hat Komma-Operator eine niedrigere Priorität als operator=, Daher entspricht x = 2,3;(x = 2),3;. (Die Rangfolge der Operatoren bestimmt, wie die Operatoren an ihre Argumente gebunden werden, je nach Rangfolge enger oder lockerer als andere Operatoren.)

Beachten Sie, dass der Komma-Ausdruck hier (x = 2),3 Und nicht 2,3 Ist. x = 2 Wird zuerst ausgewertet (und die Nebenwirkungen werden vervollständigt), dann wird das Ergebnis verworfen, dann wird 3 Ausgewertet (es tut tatsächlich nichts). Deshalb ist der Wert von x2. Beachten Sie, dass 3 Das Ergebnis des gesamten Kommaausdrucks ist (d. H. x = 2,3) Und nicht zur Zuweisung an x verwendet wird. (Ändern Sie es in x = (2,3);, x wird mit 3 Zugewiesen.)

Für return 2,3; Lautet der Kommaausdruck 2,3, 2 Wird ausgewertet, das Ergebnis verworfen und dann 3 Ausgewertet und als Ergebnis des zurückgegeben ganzer Komma-Ausdruck, der später von der return-Anweisung zurückgegeben wird.


Zusätzliche Informationen zu Ausdrücken und Anweisungen

Ein Ausdruck ist eine Folge von Operatoren und deren Operanden, die eine Berechnung spezifizieren.

x = 2,3; Ist Ausdrucksanweisung , x = 2,3 Ist hier der Ausdruck.

Ein Ausdruck gefolgt von einem Semikolon ist eine Anweisung.

Syntax: attr(optional) expression(optional) ; (1)

return 2,3; Ist Sprunganweisung ( Rückkehranweisung ), 2,3 Ist hier der Ausdruck.

Syntax: attr(optional) return expression(optional) ; (1)

138
songyuanyao

Der Komma-Operator (auch als Ausdruckstrennung bezeichnet) wird von links nach rechts ausgewertet. So return 2,3; ist äquivalent zu return 3;.

Die Auswertung von x = 2,3; ist (x = 2), 3; wegen Operatorrangfolge. Die Auswertung erfolgt weiterhin von links nach rechts, und der Ausdruck gesamt hat den Wert 3, wobei der Nebeneffekt von x den Wert 2 annimmt.

32
Bathsheba

Diese Aussage:

  x = 2,3;

besteht aus zwei Ausdrücken :

> x = 2
> 3

Seit Operatorrangfolge , = hat Vorrang vor Komma ,, so x = 2 wird ausgewertet und nach 3. Dann ist x gleich 2.


Im return stattdessen:

int f(){ return 2,3; }

Die Sprachsyntax lautet:

return <expression>

Hinweis return ist nicht Teil des Ausdrucks.

In diesem Fall werden die beiden Ausdrücke ausgewertet:

> 2
> 3

Aber nur die zweite (3) Wird zurückgegeben.

19
Biagio Festa

Versuchen Sie, den simplen Ansatz anzuwenden, indem Sie mit Klammern den Vorrang hervorheben:

( x = 2 ), 3;

return ( 2, 3 );

Jetzt können wir sehen, dass der binäre Operator "," von links nach rechts auf beide Seiten gleich funktioniert.

2
Luciano