示例代码
int a=3;
int b=4;
a^=(b^=(a^=b));
在 c++ 中它交换变量,但在 java 中我们得到 a=0, b=4 为什么?
通过在一个语句中编写全部交换,您依赖于内部a^=b
表达式相对于外部a^=(...)
表达式的副作用。您的 Java 和 C++ 编译器做事不同。
为了正确进行异或交换,您必须使用至少两个语句:
a ^= b;
a ^= (b ^= a);
但是,交换变量的最佳方式是使用临时变量以普通方式进行,并让编译器选择最佳方式来实际执行它:
int t = a;
a = b;
b = t;
在最好的情况下,编译器根本不会为上述交换生成任何代码,而只会开始处理持有的寄存器,a
反之亦然b
。你不能编写任何不胜过任何代码的棘手异或代码。
这也不能保证在 C++ 中工作。这是未定义的行为。
您应该在三个单独的语句中执行此操作:
a ^= b;
b ^= a;
a ^= b;