4

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

我的印象是这将始终有效,因为“|”左侧的“a”的值 将被存储在一个寄存器中,然后对“a”的赋值将否定对“b”赋值的影响。

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

3 回答 3

10

您正在修改一个变量并在没有中间序列点的情况下读取它的值。

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

这是未定义的行为。您无权对代码的作用抱有任何期望。

于 2012-06-20T15:12:01.497 回答
2

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

int a = 5;
int b = -13;
b = a;
于 2012-06-20T15:05:10.110 回答
1

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

例如,这在 C 中递增,但在 Java 中不执行任何操作。

a = a++;
于 2012-06-20T15:14:40.977 回答