2010-10-12 11 views

Antwort

16

Durch Ihre Swap alle in einer Erklärung zu schreiben, Sie sind auf Nebenwirkungen des inneren a^=b Ausdruck in Bezug auf den äußeren a^=(...) Ausdruck zu verlassen. Ihre Java- und C++ - Compiler machen Dinge anders.

Um die xor Swap richtig zu machen, müssen Sie mindestens zwei Anweisungen verwenden:

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

Allerdings ist der beste Weg, Variablen tauschen sie die banale Art und Weise mit einer temporären Variablen zu tun, und lassen sie den Compiler, den besten Weg wählen, um tatsächlich tut es:

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

im besten Fall kann der Compiler keinen Code auf alle für den oben genannten Swap erzeugen, und wird einfach anfangen, die Register der Behandlung, diehaltenund b andersherum. Sie können keinen komplizierten Xor-Code schreiben, der überhaupt keinen Code übertrifft.

+2

Beachten Sie, dass "das XOR richtig vertauschen" im Randfall nicht funktioniert, wenn "a" und "b" die gleiche Variable sind. –

+2

+1 für eine ideologischere Möglichkeit, Variablen zu tauschen. – Gorgen

+0

vielen dank ... –

7

Das ist nicht garantiert, in C++ entweder zu arbeiten. Es ist undefiniertes Verhalten.

Sie sollten es in drei verschiedenen Aussagen machen:

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

Der Grund ist, dass nicht genau zwischen zwei Sequenzpunkten (zB a;) eine Variable nicht Ändern Sie mehr als einmal, damit kein undefiniertes Verhalten auftritt –