为什么单行XOR交换在Javascript中不起作用但在C++中有效?

use*_*334 4 javascript c++ swap xor

在javascript中,如果我写:

var a = 6;
var b = 4;
a ^= b ^= a ^= b;
console.log(a, b);
Run Code Online (Sandbox Code Playgroud)

结果将是0 6.
但如果我写:

var a = 6;
var b = 4;
a ^= b;
b ^= a; 
a ^= b;
console.log(a, b);
Run Code Online (Sandbox Code Playgroud)

结果将是4 6.这是正确的.

为什么在JavaScript中这种单行XOR交换方式不起作用?
为什么它在C++中运行良好?

mol*_*ilo 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
Run Code Online (Sandbox Code Playgroud)

在C++中,您正在对同一对象进行无序修改,因此程序未定义.

这样做的道理是,聪明的代码很少.

  • 为什么它在C++中无序?操作员本身具有从右到左的关联性. (2认同)