数学分析法:
1 #include<stdio.h>
2 int main()
3 {
4 int a = 10;
5 int b = 20;
6 a = a + b;
7 b = a - b;
8 a = a - b;
9 printf("a=%d b=%d\n", a, b);
10
11 return 0;
12 }
我们知道两个加数,一定可以交换它们的值。a+b求得它们的和,比如为sum,但我们完全可以不再定义一个变量sum,而赋值给a或者b都是可以的,为什么呢?因为知道两个数的和,以及其中一个加数,一定可以得到另一个数。所以就算先覆盖一个加数也是无所谓的。得到a+b的和赋值给a之后,要把a和b交换,只用将a(sum)减去b,此时减出来的结果相当于最初的a(10),赋值给b了。道理很简单,a+b=sum;那么一定有sum-b=a。6-7行之后,a还是sum,b已经是之前的a了,最后就该把最初的b赋值给a了,已经很简单,和与加数知道两个即可,此时a(sum=30)-b(此时已经是a了,b=10),要交换,只用把a(sum=30)-b(10)赋值给a,这样就达到两个变量交换的目的了。
为了锻炼思维,可把上面第6行变成:b=a+b;那么后面该怎么写?如果理解了的话应该是不困难的。
eg:
b = a + b;
a = b - a;
b = b - a;
但是这样的方法有一点不好,就是可能会有溢出,万一两个int相加大于最大的数了,这个方法就失效了。
所以,需要另外一种方法:
异或:相同为0,不同为1.即1^1=0;1^0=1。X^0=X,a^b=b^a,a^b^c=(a^b)^c=a^(b^c).
1 #include<stdio.h>
2 int main()
3 {
4 int a = 1;
5 int b = 2;
6 a = a ^ b;
7 b = a ^ b;
8 a = a ^ b;
9 printf("a=%d b=%d\n", a, b);
10
11 return 0;
12 }
只用将上面的减号变成异或(^)就可以实现交换,上诉代码其实是第一种方式的翻版。
但通过汇编代码发现,少一个变量,并不意味着更快。这个方式,只是为了可能的面试题。实际开发中,还是用三个变量转换的更好。