k_eckelhttp://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走一遍应该就可以得到原因了。当然解决方案也很简单:先做判断即可。

       然而好像这里诠释了一个道理:一切最平实的往往都是简约的、自然的

Posted on 2005-07-21 10:36  k_eckel's mindview  阅读(641)  评论(6编辑  收藏  举报