2010-10-12 10 views

Respuesta

16

Al escribir su canje de todos en un estado de cuenta, usted está confiando en los efectos secundarios de la expresión a^=b interior con respecto al a^=(...) expresión externa. Sus compiladores de Java y C++ están haciendo las cosas de manera diferente.

Con el fin de hacer el canje xor correctamente, usted tiene que utilizar al menos dos estados:

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

Sin embargo, la mejor manera de cambiar las variables es hacerlo de la manera mundana con una variable temporal, y dejar que el compilador de elegir la mejor manera de hacerlo realidad:

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

en el mejor de los casos, el compilador generará ningún código en absoluto para el canje anterior, y simplemente comenzar a tratar a los registros que mantienen a y b al revés. No puede escribir ningún código xor complicado que no supere ningún código.

+2

Tenga en cuenta que "hacer el intercambio XOR correctamente" no funciona en el caso límite de que 'a' y 'b' son la misma variable. –

+2

+1 para una forma más ideomática de intercambiar variables. – Gorgen

+0

muchas gracias ... –

7

No se garantiza que funcione en C++ tampoco. Es un comportamiento indefinido.

Debe hacerlo en tres estados separados:

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

La razón es que no es estrictamente hablando entre dos puntos de secuencia (por ejemplo, una;) una variable no puede cambie más de una vez, para evitar un comportamiento indefinido –

Cuestiones relacionadas