天天看点

也谈交换两个变量

不使用第三个变量交换两个变量的值,老生常谈了

常见的两种方法

int a = 1;

int b = 2;

也谈交换两个变量

 1 int a = 1;

 2 int b = 2;

 3 

 4 方法一:加减法

 5 a = a + b;

 6 b = a - b;

 7 a = a - b;

 8 

 9 方法二:异或操作

10 a = a ^ b;

11 b = a ^ b;

12 a = a ^ b;

13 

方法三:乘除法

a = a * b ;

b = a / b ;

a = a / b ;

也谈交换两个变量

最近在园子里看到下面的方法

1 a = b + (b = a) * 0;

乍一看,真不敢相信是真的,上机一试还真行,但仅限于C#,在C++下面是不行的

看一下反汇编后的代码就一目了然了

C#反汇编代码

也谈交换两个变量

Code

C++反汇编代码:

也谈交换两个变量

可见二者的区别就是,C#在求值过程中保存了b的值,而C++没有

总结:

此题的本质就是求一种操作X,要保证X是可逆操作,设其逆操作为Y, 也即,若 p X q = r 成立,那么一定有 r Y q = p 成立

那么首先令

a = a X b;

这样a保存了a和b进行X操作后的结果

然后再

b = a Y b

因为此时a = a X b, 又因为Y是X的逆操作,所以此时 b = a

最后再

a = a Y b

此时a = a X b, 但是 b = a,所以 a = b

纵观上面几种方法,它们的操作都是可逆的

加法 <-> 减法

乘法 <-> 除法

异或 <-> 异或 (异或操作的逆操作是它本身)

本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2009/08/27/1555188.html,如需转载请自行联系原作者