1、int a ,b ;
a=20;
b=55;
a=a+b;
b=a-b;
a=a-b;
完成交换,在a=a+b阶段有可能会溢出,但是在a-b 阶段 又还原回来了,所以即使是溢出了 ,还是能完成数值交换。
2、int a, b ;
a=20;
b=55;
a=a^b;
b=a^b;
a=a^b;
3、int a, b ;
a=20;
b=50;
a=(a+b)-(b=a);
4、int a, b ;
a=20;
b=50;
a=b-a;
b=b-a;
a=a+b;
5、int a, b ;
a=20;
b=50;
a=a*b;
b=a/b;
a=a/b;
此方法中a、b 不为0
6、int *a,*b;
a=new int(10); //给指针赋值
b=new int(20); //a=0x00030828,b=0x00030840
a=(int*)(b-a); //a=0x00000006
b=(int*)(b-int(a)); //b=0x00030828
a=(int*)(b+int(a)); //a=0x00030840
需要注意的是:最后三句话中,只有第一句是两个指针之间的计算,其他都是指针和整数的计算,否则会导致计算错误,严重导致系统出错。
通过以上运算a、b的地址就完成了交换,a指向了原先b指向的值,b指向原先a指向的值!
此算法同样没有使用第三变量就完成了值的交换,与算术算法比较它显得不好理解,但是它有它的优点即在交换很大的数据类型时,比如说自定义的大型结构或者类,它的执行速度比算术算法快。因为它交换的时地址,而变量值在内存中是没有移动过的。(以下称为地址算法)
阅读(827) | 评论(0) | 转发(0) |