In cpp, il risultato del seguente snippet di codice è: 5 5 5 Ma in java, il risultato dello stesso snippet di codice è: 3 5 7 Non so perché,
Perché C++ non è Java :)
Si sta modificando la variabile v
nelle ultime due chiamate di funzione. Diamo un'occhiata al lo smontaggio (debug qui per vedere le cose più chiaramente, nel rilascio viene utilizzato un valore statico di 5
, ma potrebbe anche essere 7
altrettanto facilmente Capirete perché.):
h.fn(v).fn(v=5).fn((v=7));
00411565 mov dword ptr [v],7
0041156C mov dword ptr [v],5
00411573 mov eax,dword ptr [v]
00411576 push eax
L'ordine della valutazione dell'espressione non è garantito l'ordine in cui chiamate le funzioni qui. Si sta modificando v
tra sequence points. 7
viene assegnato a v
, quindi 5
, quindi viene chiamata la prima funzione. Si noti che non deve essere 7
e quindi 5
in questo ordine, potrebbe essere scambiato! L'ordine di valutazione non è specificato, potrebbe essere qualsiasi cosa.
Si dispone di una catena di funzioni che mutano v
due volte. Non puoi contare sul fatto che ogni mutazione si verificherà nell'ordine in cui l'hai digitata qui.
Possiamo semplificarlo. Diciamo che abbiamo due funzioni; x
e che restituiscono entrambi uno int
. Se scrivo:
int k = x() + y();
v'è alcuna garanzia che x()
sarà chiamato prima y()
. Quindi, se si sta modificando un argomento comune a entrambe le funzioni, la mutazione può verificarsi prima nella chiamata a y()
, che è ciò che si sta vedendo.
fonte
2012-03-29 00:51:27
La risposta breve è "C++ non è Java." –
BTW, adoro le domande che mi consentono di smontare un po 'lo smontaggio. :) –