为什么用xor交换在c ++中工作正常但在java中却没有?一些难题

时间:2010-10-12 08:15:28

标签: java c++ puzzle swap xor

  

可能重复:
  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为什么?

2 个答案:

答案 0 :(得分:17)

通过在一个语句中编写swap,您依赖于内部a^=b表达式相对于外部a^=(...)表达式的副作用。您的Java和C ++编译器的工作方式不同。

为了正确进行xor交换,你必须至少使用两个语句:

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

然而,交换变量的最佳方法是使用临时变量以平凡的方式进行,并让编译器选择实际执行它的最佳方法:

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

在最好的情况下,编译器将为上述交换生成 no code ,并且只会开始处理持有ab其他寄存器的寄存器四处走走。你不能编写任何根本没有代码的棘手的xor代码。

答案 1 :(得分:7)

也不能保证在C ++中工作。这是未定义的行为。

你应该在三个单独的陈述中这样做:

a ^= b; 
b ^= a;
a ^= b;