为什么与 xor 进行交换在 C++ 中工作正常,但在 Java 中却不行?一些谜题[重复]

2024-03-26

可能的重复:
为什么这个语句在 java 中不起作用 x ^= y ^= x ^= y; https://stackoverflow.com/questions/3844934/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,为什么?


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

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

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

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

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

在最好的情况下,编译器会生成根本没有代码对于上面的交换,并且将简单地开始处理保存的寄存器a and b另一种方式。您无法编写任何复杂的异或代码来击败任何代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么与 xor 进行交换在 C++ 中工作正常,但在 Java 中却不行?一些谜题[重复] 的相关文章

随机推荐