为什么单行 XOR 交换在 Javascript 中不起作用但在 C++ 中起作用?
Why single-line XOR swap doesn't work in Javascript but works in C++?
在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中这种单行异或交换方式不起作用?
为什么它在 C++ 中运行良好?
在 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++ 中,您对同一个对象进行无序修改,因此程序未定义。
这样做的寓意是很少有聪明的代码。
在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中这种单行异或交换方式不起作用?
为什么它在 C++ 中运行良好?
在 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++ 中,您对同一个对象进行无序修改,因此程序未定义。
这样做的寓意是很少有聪明的代码。