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

And*_*i N 8 c++ java puzzle swap xor

可能重复:
为什么这个语句在java x ^ = y ^ = x ^ = y中不起作用;

示例代码

int a=3;
int b=4;
a^=(b^=(a^=b));
Run Code Online (Sandbox Code Playgroud)

在c ++中它交换变量,但在java中我们得到a = 0,b = 4为什么?

Gre*_*ill 17

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

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

a ^= b; 
a ^= (b ^= a);
Run Code Online (Sandbox Code Playgroud)

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

int t = a;
a = b;
b = t;
Run Code Online (Sandbox Code Playgroud)

在最好的情况下,编译器将生成完全没有代码针对上述交换,并就干脆开始把持有的寄存器ab周围的其他方式.你不能编写任何根本没有代码的棘手的xor代码.

  • 请注意,"正确执行XOR交换"在"a"和"b"是同一个变量的边缘情况下不起作用. (2认同)
  • +1用于交换变量的更符合意义的方式. (2认同)

rek*_*o_t 7

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

你应该用三个单独的陈述来做:

a ^= b; 
b ^= a;
a ^= b;
Run Code Online (Sandbox Code Playgroud)