En écrivant votre échange en une seule déclaration, vous comptez sur les effets secondaires de l'expression a^=b
intérieure par rapport à l'expression a^=(...)
externe. Vos compilateurs Java et C++ font les choses différemment.
Pour faire l'échange de XOR correctement, vous devez utiliser au moins deux déclarations:
a ^= b;
a ^= (b ^= a);
Cependant, la meilleure façon d'échanger des variables est de le faire de la façon banale avec une variable temporaire, et laissez le compilateur choisir la meilleure façon de le faire réellement:
int t = a;
a = b;
b = t;
Dans le meilleur des cas, le compilateur génère pas de code du tout pour l'échange ci-dessus, et va simplement commencer à traiter les registres qui détiennent a
et b
l'inverse. Vous ne pouvez pas écrire de code Xor difficile qui ne bat aucun code du tout.
Cela devrait être évité à un niveau si élevé: http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_avoidance_in_practice – JoshD