2012-03-29 19 views
5

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é, c'è qualcuno potrebbe spiegarlo? Grazie mille!Priorità espressione? Come si verifica questo risultato?

class H 
{ 
    public: 
    H &pr (int n, char * prompt) 
    { 
     cout<<prompt<<n<<" "; 
     return *this; 
    } 

    H &fn(int n) 
    { 
     return pr(n,""); 
    } 
}; 

void test() 
{ 
    int v=3; 
    H h; 
    h.fn(v).fn(v=5).fn((v=7)); 
} 
+2

La risposta breve è "C++ non è Java." –

+0

BTW, adoro le domande che mi consentono di smontare un po 'lo smontaggio. :) –

risposta

6

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.

+1

+1 Per renderlo un po 'più esplicito: il programma ha * Comportamento indefinito * dallo standard e ciò significa che il programma può sostanzialmente produrre uno dei seguenti output: 3 5 6; 3 5 5; 3 7 7; 5 5 5; 5 5 7; 5 7 7; 7 7 7 (e forse altri che ho saltato in mezzo) –

+0

Ce l'ho, grazie mille. – newda

2

Il problema qui è che lo standard non garantisce come vengono valutate le espressioni.

Vabbè, lo fa in parte, ma se si compila il codice si ottiene un messaggio di avviso specifico che afferma

warning: operation on ‘v’ may be undefined 

Penso che questa questione possa illuminarvi su questo temi: Is this code well-defined?

Problemi correlati