我最近检查了使用XOR函数交换两个变量的小代码。为此,我使用了JavaScript。
设x和y是两个变量,设x = 4, y = 6。
x = x ^ y; y = y ^ x; x = x ^ y;
它很好地交换了变量。请注意,我将x和y保持不同,以防止由于第一个XOR而可能发生的别名。
然后,观察语句,我写道:x = x ^ (y = y ^ (x = x ^ y )); This正确地交换了变量y,但使x始终为0。
此外,看起来也是等价表达式的x ^= y ^= x ^= y;产生了与第二种情况相同的错误结果。
但是,所有这些语句都等价地在Java上运行,并一致地产生相同的结果。
我还对JavaScript使用了严格模式。
这三个陈述在JavaScript上是不是不等价,还是我在这里漏掉了什么关键的东西?
发布于 2016-07-22 07:48:32
x = x ^ y;
y = y ^ x;
x = x ^ y;这是可行的,因为它就像
x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_1 ^ y_1;然后,
x_final = x_2 = x_1 ^ y_1 = x_0 ^ y_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ y_0 ^ x_0 ^ y_0
= y_0
y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0
= x_0;你的x = x ^ (y = y ^ (x = x ^ y ));是这样的
x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_0 ^ y_1;然后,
x_final = x_2 = x_0 ^ y_1 = x_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ x_0 ^ y_0
= 0
y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0
= x_0;如果你使用x = (y = y ^ (x = x ^ y )) ^ x;,它就可以工作了。
这是因为JS从左到右解析表达式,而您希望x成为修改后的值,而不是初始值。
https://stackoverflow.com/questions/38510401
复制相似问题