int x=1;
int y=2;
x ^= y ^= x ^= y;
我期望这些值被交换。但它给出 x=0 和 y=1。
当我用C语言尝试时,它给出了正确的结果。
您的陈述大致相当于此扩展形式:
x = x ^ (y = y ^ (x = x ^ y));
与 C 不同,在 Java 中,保证二元运算符的左操作数先于右操作数求值。评估如下:
x = x ^ (y = y ^ (x = x ^ y))
x = 1 ^ (y = 2 ^ (x = 1 ^ 2))
x = 1 ^ (y = 2 ^ (x = 3))
x = 1 ^ (y = 2 ^ 3) // x is set to 3
x = 1 ^ (y = 1)
x = 1 ^ 1 // y is set to 1
x = 0 // x is set to 0
您可以反转每个异或表达式的参数顺序,以便在再次计算变量之前完成赋值:
x = (y = (x = x ^ y) ^ y) ^ x
x = (y = (x = 1 ^ 2) ^ y) ^ x
x = (y = (x = 3) ^ y) ^ x
x = (y = 3 ^ y) ^ x // x is set to 3
x = (y = 3 ^ 2) ^ x
x = (y = 1) ^ x
x = 1 ^ x // y is set to 1
x = 1 ^ 3
x = 2 // x is set to 2
这是一个更紧凑的版本,也可以使用:
x = (y ^= x ^= y) ^ x;
但这是交换两个变量的真正可怕的方式。使用临时变量是一个更好的主意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)