我被要求在不使用临时变量或使用xor的情况下编写交换,我想出了这个
在Java中,这可行,但在C / C ++中,这不起作用
我的印象是,由于'|'左侧'a'的值,这总是有效的将被存储在一个寄存器中,然后分配给'a'将否定对'b'的指定值的影响。
int a = 5;
int b = -13;
b = a | (0 & (a = b));
答案 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++;