2015-09-17 31 views
5

Questa accaduto mentre stavo affrontando un 'Cracking l'intervista Coding' domanda:Java comportamento operatore di assegnazione vs C++

scrivere una funzione per scambiare un numero al posto (cioè, senza variabili temporanee)

ho deciso di scrivere la mia soluzione in Java (perché ho intenzione di usare Java nelle mie interviste di stage.)

mi si avvicinò con una soluzione che ero quasi sicuro era la risposta giusta (perché l'ho fatto in una riga):

public static void main(String args[]) { 
     int a = 5; 
     int b = 7; 
     a = b - a + (b = a); 
     System.out.println("a: " + a + " b: " + b); 
    } 

Sicuramente, questo codice esegue il risultato desiderato. a == 7 e b == 5.

Ora ecco la parte divertente.

Questo codice non verrà eseguito in C++, né questa soluzione è nella parte posteriore del libro.

Quindi la mia domanda è: perché la mia soluzione funziona esattamente? Suppongo che Java faccia le cose in modo diverso rispetto ad altre lingue?

+0

Suggerimento: xor ........... –

+1

Penso che (b = a) non restituisca nulla in C++. O forse mi sbaglio, non conosco il C++. – Sweeper

+1

Per java: http://stackoverflow.com/questions/12850676/return-value-of-assignment-operator –

risposta

5

guarda il Java Language Specification, section 15.7 (Evaluation Order):

Le garanzie linguaggio di programmazione Java che gli operandi di operatori sembrano essere valutata in uno specifico ordine di valutazione, vale a dire, da sinistra a destra.

Quindi in Java l'ordine di valutazione è ben definito e fa ciò che ci si aspetta.

La specifica C++ non fornisce tale garanzia; in effetti è un comportamento indefinito, quindi il programma potrebbe letteralmente fare qualsiasi cosa.

Citando dal cppreference, rilevando che nessuna regola sequenziamento esiste per operandi sequenziamento all'aritmetica operatori:

Se un effetto collaterale su un oggetto scalare è non in sequenza rispetto ad un valore calcolo utilizzando il valore dello stesso oggetto scalare, il comportamento è indefinito.

+2

Al contrario, "Se un effetto collaterale su un oggetto scalare viene annullato rispetto a un calcolo del valore utilizzando il valore dello stesso oggetto scalare, il comportamento non è definito." ([cppreference] (http://en.cppreference.com/w/cpp/language/eval_order)), osservando che non esiste alcuna regola di sequenziamento per il sequenziamento degli operandi agli operatori aritmetici. – Amadan

+0

@Amadan grazie, l'ho incorporato –

Problemi correlati