5

Rozważmy następujący pseudokod (język agnostycznego):Operatory przypisania złożonego, co się stanie, jeśli wartość zostanie zmieniona (w międzyczasie)?

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

    return 2; 
} 

int v = 1; 

v += f(v); 

Gdy funkcja f zmienia y (czyli v) podczas oceny v += f(v), to oryginalna wartość v „zamrożone” i zmiany v „stracone”?

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 

Odpowiedz

3

W większości języków += operatora (jak również jakikolwiek inny związek przypisania operatora, a także prostego przypisania operatora) jest od prawej do lewej zespolenie. To oznacza, że ​​najpierw zostanie obliczona wartość f(v), następnie , a następnie jego wynik zostanie dodany do wartości wartości v.

Więc w przykładzie powinno być 4, nie 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

Oznacza to, tak samo jak _zwięknij wartość v o ilość po prawej stronie, prawda? – gremo

+0

Powiedziałbym, że "oceń właściwą stronę, a następnie zwiększ ją o jej wynik". Kluczową kwestią jest tutaj kolejność oceny. – raina77ow

+0

Dobrze, rozumiesz. Dziękuję za odpowiedź i przykłady na żywo. – gremo

Powiązane problemy