为什么与 xor 进行交换在 c++ 中工作得很好但在java中却没有?一些谜题

发布于 2024-09-27 01:34:04 字数 333 浏览 6 评论 0原文

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

示例代码

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

在巴黎塔顶看东京樱花 2024-10-04 01:34:04

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

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

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

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

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

在最好的情况下,编译器将不会为上述交换生成任何代码,并且只会开始处理保存 ab 的寄存器代码> 反过来。您无法编写任何复杂的异或代码来击败任何代码。

By writing your swap all in one statement, you are relying on side effects of the inner a^=b expression relative to the outer a^=(...) 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:

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

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:

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

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 and b the other way around. You can't write any tricky xor code that beats no code at all.

笑着哭最痛 2024-10-04 01:34:04

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

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

a ^= b; 
b ^= a;
a ^= b;

That's not guaranteed to work in C++ either. It's undefined behavior.

You should do it in three separate statements:

a ^= b; 
b ^= a;
a ^= b;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文