我被要求在不使用临时变量或使用 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++;