对于允许用第三个变量来转存交换两个变量的值,有指针和引用。这里很简单,直接给出代码
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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。