可能重复:
Why is this statement not working in java x ^= y ^= x ^= y;
示例代码
int a=3;
int b=4;
a^=(b^=(a^=b));
在c ++中它交换变量,但在java中我们得到a = 0,b = 4为什么?
答案 0 :(得分:17)
通过在一个语句中编写swap,您依赖于内部a^=b
表达式相对于外部a^=(...)
表达式的副作用。您的Java和C ++编译器的工作方式不同。
为了正确进行xor交换,你必须至少使用两个语句:
a ^= b;
a ^= (b ^= a);
然而,交换变量的最佳方法是使用临时变量以平凡的方式进行,并让编译器选择实际执行它的最佳方法:
int t = a;
a = b;
b = t;
在最好的情况下,编译器将为上述交换生成 no code ,并且只会开始处理持有a
和b
其他寄存器的寄存器四处走走。你不能编写任何根本没有代码的棘手的xor代码。
答案 1 :(得分:7)
也不能保证在C ++中工作。这是未定义的行为。
你应该在三个单独的陈述中这样做:
a ^= b;
b ^= a;
a ^= b;