5

Betrachten Sie den folgenden Pseudo-Code (sprachunabhängig):Compound-Zuweisungsoperatoren, was passiert, wenn der Wert (in der Zwischenzeit) geändert wird?

int f(reference int y) { 
    y++; 

    return 2; 
} 

int v = 1; 

v += f(v); 

Wenn die Funktion fy ändert (dh v), während v += f(v) Auswertung ist der ursprüngliche Wert von v „eingefroren“ und Änderungen an v „verloren“?

v += f(v); // Compute the address of v (l-value) 
      // Evaluate v (1) 
      // Execute f(v), which returns 2 
      // Store 1 + 2 
printf(v); // 3 

Antwort

3

In den meisten Sprachen += Operator (sowie jeder anderen Verbindung Zuweisungsoperator sowie einfachen Zuweisungsoperator) hat von rechts nach links Assoziativität. Das bedeutet, f(v) Wert wird zuerst ausgewertet, dann sein Ergebnis wird aktuelle Wert von v hinzugefügt werden.

So in Ihrem Beispiel sollte es 4, sein nicht 3:

C++: (demo)

int f(int& v) { 
    v++; 
    return 2; 
} 

int main() { 
    int v = 1; 
    v += f(v); 
    cout << v; // 4 
} 

Perl: (demo)

sub f { 
    $_[0]++; 
    return 2; 
} 

my $v = 1; 
$v += f($v); 

print $v; # 4 
+0

Das heißt, genauso wie _just nur den Wert von v um die Menge auf der rechten Seite erhöhen, richtig? – gremo

+0

Ich würde sagen, 'bewerten Sie die rechte Seite, dann erhöhen Sie v durch sein Ergebnis'. Der entscheidende Punkt ist hier die Reihenfolge der Auswertung. – raina77ow

+0

Gut, habe den Punkt verstanden. Danke für deine Antwort und Live-Beispiele. – gremo