Java内联int swap。为什么这只适用于Java

时间:2012-06-20 15:00:35

标签: java c++ inline puzzle swap

我被要求在不使用临时变量或使用xor的情况下编写交换,我想出了这个 在Java中,这可行,但在C / C ++中,这不起作用
我的印象是,由于'|'左侧'a'的值,这总是有效的将被存储在一个寄存器中,然后分配给'a'将否定对'b'的指定值的影响。

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

3 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

在C / C ++中,按表达顺序执行分配。在Java中,无论其他表达式如何,分配都会在最后发生。

e.g。这在C中递增,但在Java中没有任何作用。

a = a++;