Warum Swap mit xor funktioniert gut in C ++, aber in Java nicht? einige Rätsel [Duplikat]

StackOverflow https://stackoverflow.com/questions/3912699

  •  29-09-2019
  •  | 
  •  

Frage

  

Mögliche Duplizieren:
   Warum ist diese Aussage nicht in Java arbeiten x ^ = y ^ = x ^ = y;

Beispielcode

int a=3;
int b=4;
a^=(b^=(a^=b));

In c ++ es tauscht Variablen, aber in Java erhalten wir a = 0, b = 4, warum?

War es hilfreich?

Lösung

Mit dem 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. Ihr Java und C ++ Compiler tun Dinge anders.

Um richtig die xor Swap zu tun, müssen Sie verwenden mindestens zwei Aussagen:

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

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

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

Im besten Fall wird der Compiler generiert keinen Code überhaupt für den oben genannten Swap und einfach beginnen, die Register, dass halten a Behandlung und b umgekehrt. Sie können keinen kniffligen xor Code schreiben, die keinen Code überhaupt schlägt.

Andere Tipps

Das ist nicht zur Arbeit in C ++ garantiert auch nicht. Es ist nicht definiertes Verhalten.

Sie sollten es in drei verschiedenen Aussagen tun:

a ^= b; 
b ^= a;
a ^= b;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top