在javascript中,如果我写:
var a = 6;
var b = 4;
a ^= b ^= a ^= b;
console.log(a, b);
结果为0 6.
但如果我写:
var a = 6;
var b = 4;
a ^= b;
b ^= a;
a ^= b;
console.log(a, b);
结果将是4 6.这是正确的。
为什么在javascript中这种单行XOR交换方式不起作用? 为什么它在C ++中运行良好?
答案 0 :(得分:6)
在JavaScript中,表达式从左到右进行评估。
这意味着您的单行评估如下:
a ^= b ^= a ^= b;
=> a = a ^ (b = b ^ (a = a ^ b))
=> a = 6 ^ (b = 4 ^ (a = 6 ^ 4))
=> a = 6 ^ (b = 4 ^ 2)
=> a = 6 ^ 6 = 0
b = 4 ^ 2 = 6
在C ++中,您正在对同一个对象进行无序修改,因此程序未定义。
这样做的道德很巧妙。