为什么单行异或交换在Javascript中不起作用,但在C++中起作用?

Why single-line XOR swap doesn't work in Javascript but works in C++?

本文关键字:但在 C++ 起作用 不起作用 为什么 交换 Javascript 单行异      更新时间:2023-10-16

在javascript中,如果我写:

var a = 6;
var b = 4;
a ^= b ^= a ^= b;
console.log(a, b);

结果将是0
但如果我写:

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++中,你对同一个对象做了无序的修改,所以程序是未定义的。

这个故事告诉我们,聪明的代码很少是错误的。

相关文章: