@RunZhi
2017-01-09T12:24:23.000000Z
字数 601
阅读 1060
C++
在C++中实现交换两个变量的函数很简单,用一个中间变量保存第一个变量的值,在把第二个变量的值赋给第一个变量,中间变量的值赋给第二个变量.这样的交换方式对于自定义类型来讲也适用(前提是有定义完备的赋值操作符和拷贝构造函数).
但有人喜欢这样的方式来进行交换.比如交换两个int型数.
void swap(int &a,int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
类似的,还有
void swap(int &a,int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
首先,两个方法在原理是上正确的.我见过不少代码都喜欢这样,似乎显得很"特别".
原理上正确不代表实现上正确,当我如此调用
int c = 5;
swap(c,c);
cout << c << endl;
这会输出什么呢?预期输出是5,但是实际上,将会输出0.
为啥?
很简单,就第一个交换函数来讲,a = a ^ b 将会使a和b都为0,因为形式参数a和b是实际参数c的引用.相当于:c = c ^ c.(即c=0).这样,无论后面怎么操作,c都是0.因此输出了0.
第二个交换函数也如此.经过第二行的操作,也是变成0.
有人可能会说:好!那我避免相同的值代换不就好了吗!但有的时候,还真不是说你想避免就避免.所以,请用相对最难出错的,中间变量法吧!
这时候,python乱入了!交换a,b只需一句
a,b = b,a
哈哈,有没有很想加入python的阵营:-).
2015.12.10