[关闭]
@RunZhi 2017-01-09T12:24:23.000000Z 字数 601 阅读 1060

C++的交换函数

C++


在C++中实现交换两个变量的函数很简单,用一个中间变量保存第一个变量的值,在把第二个变量的值赋给第一个变量,中间变量的值赋给第二个变量.这样的交换方式对于自定义类型来讲也适用(前提是有定义完备的赋值操作符和拷贝构造函数).

但有人喜欢这样的方式来进行交换.比如交换两个int型数.

  1. void swap(int &a,int &b)
  2. {
  3. a = a ^ b;
  4. b = a ^ b;
  5. a = a ^ b;
  6. }

类似的,还有

  1. void swap(int &a,int &b)
  2. {
  3. a = a + b;
  4. b = a - b;
  5. a = a - b;
  6. }

首先,两个方法在原理是上正确的.我见过不少代码都喜欢这样,似乎显得很"特别".
原理上正确不代表实现上正确,当我如此调用

  1. int c = 5;
  2. swap(c,c);
  3. 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只需一句

  1. a,b = b,a

哈哈,有没有很想加入python的阵营:-).

2015.12.10

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注