这是XOR swap algorithm的一个me脚的实现:
char a = 'a', b = 'b';
a ^= b;
b ^= a;
a ^= b;
System.out.println(a + " " + b);
按预期,输出为b a
。据我所知,Java中的赋值运算符返回赋值,这意味着以下代码应该产生相同的结果:
a ^= (b ^= (a ^= b));
但是,这只打印a
。另外,令我惊讶的是,另外两个变体都输出b a
:
变体1(效果很好):
a ^= b;
a ^= (b ^= a);
变体2(也可以正常工作):
b ^= (a ^= b);
a ^= b;
我真的很困惑。为什么我可以链接两个任务,但不能链接三个?
编辑:
作为参考,以下C代码输出b a
,这就是我提出这个问题的方式。
#include <stdio.h>
int main(void) {
char a = 'a', b = 'b';
a ^= (b ^= (a ^= b));
printf("%c %c\n", a, b);
}