Java inline int swap.为什么这只在 Java 中有效

Java inline int swap. Why does this only work in Java

本文关键字:Java 有效 为什么 inline int swap      更新时间:2023-10-16

我被要求在不使用临时变量或使用xor的情况下编写交换,我想出了这个。
在Java中,这有效,但在C/C++中这不起作用。

我的印象是这总是有效的,因为"|"左侧的"a"值将存储在寄存器中,然后会发生对"a"的赋值,从而抵消对"b"的分配值的影响。

int a = 5;
int b = -13;
b = a | (0 & (a = b));

您正在修改变量并在没有干预序列点的情况下读取其值。

b =         a          + 0 *   (a = b);
//  reading a's value        modifying a

这是未定义的行为。 您无权对代码将要做什么有任何期望。

C/C++ 编译器优化表达式0 * (a = b),以简单地0将代码片段转换为:

int a = 5;
int b = -13;
b = a;

在 C/C++ 中,同理解是按表达顺序执行的。在 Java 中,无论其他表达式如何,赋值都最后发生。

例如,这在 C 中递增,但在 Java 中什么都不做。

a = a++;