最为常见的交换程序的实现为:
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;
} /*按位异或──^
(1)格式:x^y
(2)规则:对应位相同时为0,不同时为1:3^9=10。
(3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变
*/
但是当你写了个测试程序:
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了!虽然自己和自己交换没有意义,但是不能排除没有这种可能。把这个测试用例给出来了,分析其原因也很简单:交换函数中对同一地址进行了‘减’/‘异或’操作。当然解决方案也很简单:先做判断即可。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。