5

Si consideri il seguente pseudocodice (lingua agnostico):Operatori di assegnazione composta, cosa succede se il valore viene modificato (nel frattempo)?

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

    return 2; 
} 

int v = 1; 

v += f(v); 

Quando la funzione f cambia y (cioè v), mentre la valutazione v += f(v), è il valore originale di v "congelato" e le modifiche ai v "perso"?

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 

risposta

3

Nella maggior parte delle lingue += operatore (così come qualsiasi altro operatore di assegnazione composti, così come semplice operatore di assegnazione) ha associatività da destra a sinistra. Ciò significa che il valore f(v) verrà valutato per primo, quindi il risultato verrà aggiunto al valore correntev.

Quindi nel tuo esempio dovrebbe essere 4, non 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

Cioè, lo stesso di _just incrementa il valore di v per la quantità sul lato destro_, giusto? – gremo

+0

Direi "valutare il lato destro, quindi incrementare v in base al risultato". Il punto chiave qui è l'ordine di valutazione. – raina77ow

+0

Bene, ho capito. Grazie per la tua risposta ed esempi dal vivo. – gremo