2010-10-12 11 views

risposta

16

Scrivendo lo swap tutto in una dichiarazione, si fa affidamento su effetti collaterali del interna a^=b espressione rispetto al esterna a^=(...) espressione. I tuoi compilatori Java e C++ stanno facendo le cose in modo diverso.

Per fare lo swap XOR correttamente, è necessario utilizzare almeno due affermazioni:

a ^= b; 
a ^= (b ^= a); 

Tuttavia, il modo migliore per scambiare variabili è quello di farlo nel modo più banale, con una variabile temporanea, e lasciare che il compilatore scegliere il modo migliore per farlo in realtà:

int t = a; 
a = b; 
b = t; 

Nel migliore dei casi, il compilatore genererà alcun codice affatto per lo swap di cui sopra, e sarà semplicemente iniziare a trattare i registri che contengono a e b viceversa. Non è possibile scrivere alcun codice xor ingannevole che non batte affatto codice.

+2

Nota che "fare lo scambio XOR correttamente" non funziona nel caso limite che 'a' e' b' sono la stessa variabile. –

+2

+1 per un modo più ideologico di scambiare le variabili. – Gorgen

+0

grazie mille ... –

7

Non è garantito che funzioni anche in C++. È un comportamento indefinito.

Si dovrebbe farlo in tre prospetti separati:

a ^= b; 
b ^= a; 
a ^= b; 
+0

La ragione è che non strettamente parlando tra due punti di sequenza (ad esempio a;) una variabile non può cambia più di una volta, per timore di comportamento non definito –