2010-10-12 3 views

Répondre

16

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.

+2

Notez que "faire l'échange XOR correctement" ne fonctionne pas dans le cas où "a" et "b" sont la même variable. –

+2

+1 pour une manière plus idéomatique d'échanger des variables. – Gorgen

+0

merci beaucoup ... –

7

Cela n'est pas garanti de fonctionner en C++ non plus. C'est un comportement indéfini.

Vous devriez le faire dans trois états distincts:

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

La raison étant que non-strictement parlant entre deux points de séquence (par exemple a) une variable ne peut pas changez plus d'une fois, de peur que le comportement ne soit pas défini –

Questions connexes