k_eckel:http://www.mscenter.edu.cn/blog/k_eckel & http://k-eckel.cnblogs.com
没有人会怀疑实现交换两个整数(或者字符等)的程序是很简单的,但是很多人也会被这样的一个问题郁闷:不用任何中间变量,实现两个整数的交换。在《微软面试题——反转字符串》中列出了比较常见的做法,但是这种Hack技巧却带来了后遗症。
最为常见的交换程序的实现为:
void Exch2Item(int& a,int& b) { int tmp = a; a = b; b = tmp; } |
这种解法简洁实用,所谓的Hack技巧一般有两种实现:
void Exch2Item2(int& a,int& b) { a = a + b; b = a - b; a = a - b; } |
以及:
void Exch2Item3(int& a,int& b) { a ^= b; b ^= a; a ^= b; } |
一切看起来很正常,但是当你写了个测试程序:
int main(int argc,char* argv[]) { int a = 2; int b = 3; cout<<a<<".. "<<b<<endl; Exch2Item2(a,a); cout<<a<<" .."<<b<<endl; return 0; } |
你会惊诧于结果:怎么交换后a的值变为0了!虽然自己和自己交换没有意义,但是不能排除没有这种可能。把这个测试用例给出来了,分析其原因只需要将Exch2Item2走一遍应该就可以得到原因了。当然解决方案也很简单:先做判断即可。
然而好像这里诠释了一个道理:一切最平实的往往都是简约的、自然的。