在C#/JS中的一行中用XOR交换两个变量



我正在尝试用XOR操作交换2个变量。

int a = 5;
int b = 4;
a ^= b ^= a ^= b;

这段代码可以在Objective-C和C++中使用,但在C#和JavaScript中不起作用,我无法理解原因。

与C#/Javascript相比,这与C/C++处理操作赋值(+=、^=和其他(运算符的方式略有不同有关。

在Javascript中,被分配的变量直到语句完成后才改变值。为了简化数学,假设我们在Javascript中有以下代码:

var a = 5;
var b = 4;
a += b += a += b;

在javascript中,它设置a=18(a=5+4+5+4(和b=13(b=5+4+4(。这是因为在整个语句完成之前,没有变量更改值。

相反,在C/C++中,变量赋值是在+=的每个子表达式发生时进行的。考虑相应的C代码:

int a = 5;
int b = 4;
a += b += a += b;

这给出了a=22,如下所示:首先,对表达式的最后一部分a+=b进行求值。这将导致值为9。则评估b+=9,给出b=13。然后对a+=13进行评估,得出a=22。b的值为13。

尝试使用

a ^= b;
b ^= a;
a ^= b;

链式分配混淆了C#和JS

最新更新