Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1255452
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: C/C++

2014-10-18 11:20:02

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) |
给主人留下些什么吧!~~