8

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

示例代码

int a=3;
int b=4;
a^=(b^=(a^=b));

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

4

2 回答 2

17

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

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

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

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

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

在最好的情况下,编译器根本不会为上述交换生成任何代码,而只会开始处理持有的寄存器,a反之亦然b。你不能编写任何不胜过任何代码的棘手异或代码。

于 2010-10-12T08:19:56.873 回答
7

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

您应该在三个单独的语句中执行此操作:

a ^= b; 
b ^= a;
a ^= b;
于 2010-10-12T08:18:59.073 回答