我最近检查了甜蜜的小代码,使用a.example.com
b.example.com
WHATEVER_SUB-DOMAIN_TEXT.example.com
函数交换两个变量。我为此使用了JavaScript。
让x和y为两个变量,让XOR
。
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
似乎也是等效表达式,会产生与第二种情况相同的不正确结果。
但是,所有这些语句都在Java上等效运行并且始终如一地产生相同的结果。
我还使用了JavaScript的严格模式。
这三个陈述在某种程度上不等同于JavaScript,或者我错过了一些关键的东西吗?
答案 0 :(得分:4)
x = x ^ y;
y = y ^ x;
x = x ^ y;
这很有效,因为它就像
x_1 = x_0 ^ y_0;
y_1 = y_0 ^ x_1;
x_2 = x_1 ^ y_1;
然后,
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;
您的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;
然后,
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;
如果您使用x = (y = y ^ (x = x ^ y )) ^ x;
,那就行了。
那是因为JS从左到右解析表达式,你希望x
是修改后的值,而不是初始值。