温故知新系列(二)交换两个变量的值不用第三个变量

  对于允许用第三个变量来转存交换两个变量的值,有指针和引用。这里很简单,直接给出代码

  View Code

  

  不用第三个变量交换,可以通过以下两个方法

  View Code
1 a^=b; 
2 b^=a;
3 a^=b;
4 //或者
5 a+=b;
6 b=a-b;
7 a=a-b;

  第一次见到是从刘汝佳老师的书上看到的,但不推荐 我们去使用。

  一直以为这是一个挺不错的想法,当然,虽然不会去用,但从没有去想以上会有bug。偶尔看到这个博文,发现原来这样的交换是有隐患的:

  当两个数的地址相同的时候,结果会变为0。

  View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 void Swap(int &a , int &b)
 6 {
 7     a+=b;
 8     cout<<a<<" "<<b<<endl;
 9     b=a-b;
10     cout<<a<<" "<<b<<endl;
11     a=a-b;
12 }
13 
14 int main()
15 {
16     int i=20;
17     Swap(i,i);
18     cout<<i<<endl;
19     return 0;
20 }

  从上面的交换过程中的输出,我们发现,第一次a=a+b;的时候,a变成了40,但,别忘了,b和a是指向同一个地址的,也就是说,b的值也变化了,并且永远和a相

  等,这就是为什么交换后为0的缘由了。

  解决方法也很简单,就是在用两个变量交换的时候,判断a,b是否相等即可。

作者:FreeAquar
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/FreeAquar/p/2603381.html