我最近检查了甜蜜的小代码,使用XOR
函数交换两个变量.我为此使用了JavaScript.
设x和y为两个变量并让x = 4, y = 6
.
x = x ^ y;
y = y ^ x;
x = x ^ y;
它可以很好地交换变量.请注意,我保持x
和y
不同,以防止可由于首先发生混淆XOR
.
然后,观察声明,我写道:
x = x ^ (y = y ^ (x = x ^ y ));
这交换变量y
正确,但x
总是0
.
而且,x ^= y ^= x ^= y;
似乎也是等效表达式产生与第二种情况相同的不正确结果.
但是,所有这些语句都在Java上等效运行,并且始终如一地生成相同的结果.
我还使用JavaScript的严格模式.
这三个陈述在某种程度上不等同于JavaScript或我错过了一些关键的东西吗?
x = x ^ y;
y = y ^ x;
x = x ^ y;
Run Code Online (Sandbox Code Playgroud)
这之所以有效,是因为它就像
x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_1 ^ y_1;
Run Code Online (Sandbox Code Playgroud)
然后,
x_final = x_2 = x_1 ^ y_1 = x_0 ^ y_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ y_0 ^ x_0 ^ y_0
= y_0
y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0
= x_0;
Run Code Online (Sandbox Code Playgroud)
你的x = x ^ (y = y ^ (x = x ^ y ));
就像
x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_0 ^ y_1;
Run Code Online (Sandbox Code Playgroud)
然后,
x_final = x_2 = x_0 ^ y_1 = x_0 ^ y_0 ^ x_1 = x_0 ^ y_0 ^ x_0 ^ y_0
= 0
y_final = y_1 = y_0 ^ x_1 = y_0 ^ x_0 ^ y_0
= x_0;
Run Code Online (Sandbox Code Playgroud)
如果你使用的话它会起作用x = (y = y ^ (x = x ^ y )) ^ x;
。
这是因为 JS 从左到右解析表达式,而你希望它x
是修改后的值,而不是初始值。
归档时间: |
|
查看次数: |
154 次 |
最近记录: |