为什么与 xor 进行交换在 c++ 中工作得很好但在java中却没有?一些谜题
示例代码
int a=3;
int b=4;
a^=(b^=(a^=b));
在 c++ 中它交换变量,但在 java 中我们得到 a=0, b=4 为什么?
Possible Duplicate:
Why is this statement not working in java x ^= y ^= x ^= y;
Sample code
int a=3;
int b=4;
a^=(b^=(a^=b));
In c++ it swaps variables, but in java we get a=0, b=4 why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
通过将 swap all 写在一条语句中,您将依赖于内部
a^=b
表达式相对于外部a^=(...)
表达式的副作用。 Java 和 C++ 编译器的处理方式不同。为了正确地进行异或交换,您必须至少使用两个语句:
但是,交换变量的最佳方法是使用临时变量以普通方式进行,并让编译器选择实际执行此操作的最佳方法:
在最好的情况下,编译器将不会为上述交换生成任何代码,并且只会开始处理保存
a
和b
的寄存器代码> 反过来。您无法编写任何复杂的异或代码来击败任何代码。By writing your swap all in one statement, you are relying on side effects of the inner
a^=b
expression relative to the outera^=(...)
expression. Your Java and C++ compilers are doing things differently.In order to do the xor swap properly, you have to use at least two statements:
However, the best way to swap variables is to do it the mundane way with a temporary variable, and let the compiler choose the best way to actually do it:
In the best case, the compiler will generate no code at all for the above swap, and will simply start treating the registers that hold
a
andb
the other way around. You can't write any tricky xor code that beats no code at all.这也不能保证在 C++ 中有效。这是未定义的行为。
您应该在三个单独的语句中执行此操作:
That's not guaranteed to work in C++ either. It's undefined behavior.
You should do it in three separate statements: