CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

求助:不用中间变量,如何将变量a和b的值进行交换???

楼主lusanchao()2006-11-10 15:24:23 在 C/C++ / C语言 提问

不用中间变量,如何将变量a和b的值进行交换??? 问题点数:20、回复次数:59Top

1 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-11-10 15:25:46 得分 0

__asm  
  {  
  push   a  
  push   b  
  pop   a  
  pop   b  
  }Top

2 楼cy2005abc(天空与草原)回复于 2006-11-10 15:30:18 得分 0

a=a^b;  
  b=a^b;  
  a=a^b;Top

3 楼yuanhan530(千年※ 蜗牛)回复于 2006-11-10 15:31:10 得分 0

a=a+b;  
  b=a-b;  
  a=a-b;  
  ~~~~~~~~~~~`  
  Top

4 楼cy2005abc(天空与草原)回复于 2006-11-10 15:31:43 得分 0

a=a+b;  
  b=a-b;  
  a=a-b;Top

5 楼zx_hxp_jw(耗子)回复于 2006-11-10 15:32:22 得分 0

int   a,b;  
  a   =   a   +   b;  
  b   =   a   -   b;  
  a   =   a   -   b;Top

6 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-10 15:33:45 得分 0

二楼算正解  
   
  一楼有点牵强  
   
  还有可以通过   a   =   a+b  
  b=   a-b  
  a=   a-b  
  这种方式,内存有溢出  
  但是溢出两次抵消了Top

7 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-10 15:34:11 得分 0

异或运算,加减运算都对Top

8 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-10 15:34:33 得分 0

雁南飞:雁无留踪之意,水无取影之心Top

9 楼hailongchang(什么时候才能看到星星啊。。。)回复于 2006-11-10 15:36:32 得分 0

a=a^b;  
  b=a^b;  
  a=a^b;  
   
   
  用加减法一旦溢出就over了,因为不知道变量的类型,用嵌套汇编的方法也不好。Top

10 楼mmqmjy(莫名其妙)回复于 2006-11-10 15:38:11 得分 0

一楼的,堆栈不属于变量的吗  
  你还一用就用了俩Top

11 楼malligator(十步之内没有我的爱人)回复于 2006-11-10 15:39:26 得分 0

swap1(int*   a,   int   *b)   //同意  
  {  
  a=a^b;  
  b=a^b;  
  a=a^b;  
  }  
   
  swap2(int*   a,   int   *b)     //数大于二分之一MAX_INT时会溢出  
  {  
  a=a+b;  
  b=a-b;  
  a=a-b;  
  }Top

12 楼leonkiros2004(风塑幻想[猪头也当家])回复于 2006-11-10 16:29:07 得分 0

^  
  这个是什么意思啊~高手解释一下呗~Top

13 楼hailongchang(什么时候才能看到星星啊。。。)回复于 2006-11-10 16:32:57 得分 0

异或  
   
  1   ^   0     =   1  
  0   ^   1     =   1  
  0   ^   0     =   0  
  1   ^   1     =   0Top

14 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-11-10 16:43:30 得分 0

to   mmqmjy(莫名其妙)    
   
  堆栈是堆栈,变量是变量  
  不同概念的东西,你要硬说一样,那用寄存器总行了吧  
  _asm  
  {  
  pusha    
  mov   eax,a  
  mov   ebx,b  
  mov   a,ebx  
  mov   b,eax  
  popa  
  }Top

15 楼guohui4321(<看看海吹吹风>)回复于 2006-11-10 16:56:06 得分 0

a   =   a^b^(b=a);Top

16 楼dengyiwolf(七星偃月刀)回复于 2006-11-10 17:56:20 得分 0

用异或运算,  
  a=a^b;  
  b=a^b;  
  a=a^b;Top

17 楼wxspll(HDU)回复于 2006-11-10 18:00:43 得分 0

a   ^=   b   ^=   a   ^=   b;Top

18 楼wswqwps(孔子曰:打架用砖乎,不宜乱乎,照头乎,乎不死再乎.佛说:胡扯,我佛慈悲,不亦多乎,一砖乎死,减轻痛苦)回复于 2006-11-10 18:33:59 得分 0

a=a^b;  
  b=a^b;  
  a=a^b;  
  ----------  
  没有可移植性Top

19 楼phommy(石头,竹子,诗)回复于 2006-11-10 18:42:36 得分 0

b=(a,a=b);  
   
  逗号运算是左结合的,先计算a的值,然后才赋值,()里的值为a  
  没调试过~_~Top

20 楼ChrisAK(LOLICON)回复于 2006-11-10 19:06:06 得分 0

_asm  
  {  
  mov   eax,a  
  xchg   eax,b  
  mov   a,eax  
  }Top

21 楼smartcatiboy()回复于 2006-11-10 19:09:10 得分 0

数学上,不可能无中间变量交换  
  楼主就别做梦了  
   
  push也好,别的也好,其实还是变量Top

22 楼fatminforever(春臆居)回复于 2006-11-10 19:27:32 得分 0

楼上请仔细看回帖,鉴定完毕  
   
   
  这是道好老的编程题了,只用加减法就可以了,其他方法都是殊途同归  
  Top

23 楼noelo()回复于 2006-11-10 19:30:36 得分 0

a   =   a   +   b;  
  b   =   a   -   b;  
  a   =   a   -   b;Top

24 楼goldendreams(快乐生活)回复于 2006-11-10 20:15:29 得分 0

int   a,b;  
  a   =   a   +   b;  
  b   =   a   -   b;  
  a   =   a   -   b;以前见过Top

25 楼richard_ma(中子星)回复于 2006-11-10 20:49:34 得分 0

a=a^b;  
  b=a^b;  
  a=a^b;  
  ----------  
  没有可移植性  
  -----------------------------------------------  
  这个是为什么啊?在不同的编译器下异或运算实现不同吗?Top

26 楼begtostudy(我的CSDN博客:http://blog.csdn.net/begtostudy/)回复于 2006-11-10 20:53:38 得分 0

菜鸟问一句  
   
  a=a^b;  
  b=a^b;  
  a=a^b;  
   
  和用中间变量比,那个效率高呢?Top

27 楼gare1000(一夜也痴情/爱钻裙子)回复于 2006-11-10 21:36:45 得分 0

在net下:  
  a=a.tostring&b.tostring  
  b   =   a.trim(b.tostring)  
  a   =   a.trim(b.tostring)  
   
  备注:a、b   为数值和字符类型Top

28 楼sdp(雨尘)回复于 2006-11-10 22:02:09 得分 0

a=a^b;  
  b=a^b;  
  a=a^b;  
   
  记得在以潭浩强书上见过,不过没有什么必要.呵呵  
  现在的硬件方面没有什么问题了,好的可读性是比较重要的.Top

29 楼IlikeEnglish()回复于 2006-11-10 22:35:07 得分 0

b=(a+b)-(a=b)Top

30 楼IlikeEnglish()回复于 2006-11-10 22:35:35 得分 0

b=(a+b)-(a=b)Top

31 楼IlikeEnglish()回复于 2006-11-10 22:35:43 得分 0

b=(a+b)-(a=b)Top

32 楼BKgHost(黑色幽灵)回复于 2006-11-10 22:39:48 得分 0

加减法最符合要求,因为他完全是利用了数学原理,是个小算法,比异或高明,但是异或也是利用  
  电路计算方法,这个问题经典!Top

33 楼brucesea(可口可乐)回复于 2006-11-10 22:56:28 得分 0

用+-有溢出问题,  
  直接用^,当a,b是相同内存单元时结果就不对,得到都为0  
  修改一下:  
  #define   swap(a,   b)   (   (a==b)   ||   ((a)   ^=   (b)),   ((b)   ^=   (a)),   ((a)   ^=   (b)))Top

34 楼smallbird3()回复于 2006-11-10 23:02:58 得分 0

a=(a+b)/2;  
  b=a-b;  
  a=a-b;  
  b=2*a+b;  
  Top

35 楼myjerry(网络猎人)回复于 2006-11-10 23:06:07 得分 0

长见识了!Top

36 楼yuanchuang(元创)回复于 2006-11-10 23:08:38 得分 0

以前也喜欢看这种类型的问题,但是现在想不明白,这有什么意义,呵呵Top

37 楼left_zxp(专逃课的左手)回复于 2006-11-10 23:12:07 得分 0

cy2005abc()   正解Top

38 楼redleaves(程序员)回复于 2006-11-10 23:20:38 得分 0

汇编有xchg指令...Top

39 楼szto2003(dotnet)回复于 2006-11-10 23:25:03 得分 0

a=a+b;  
  b=a-b;  
  a=a-b;Top

40 楼YuLimin(阿敏总司令:简单就是美—钻石闪闪您快结贴!)回复于 2006-11-10 23:25:55 得分 0

记得是2001年网络程序员的考题。。。Top

41 楼softboysxp(fiNAL.Y)回复于 2006-11-10 23:56:41 得分 0

b   =   a   +   b   -   (a   =   b)Top

42 楼BAYERN(我有个愿望-要把月亮踹成直的,把太阳捏成方的)回复于 2006-11-11 08:55:05 得分 0

揭贴吧Top

43 楼HoBoss(学徒)回复于 2006-11-11 09:19:33 得分 0

 
  a=a^b;  
  b=a^b;  
  a=a^b;  
   
  我记得也是用这个,因为用加减法会有溢出的问题  
  Top

44 楼whypp(绝望生鱼片)回复于 2006-11-11 09:46:52 得分 0

用异或.但是java下不行Top

45 楼luora()回复于 2006-11-11 10:18:41 得分 0

swap1(int*   a,   int   *b)   {  
  a=a^b;  
  b=a^b;  
  a=a^b;  
  }//同意这个,这样可以避免发生溢出错误  
   
  Top

46 楼tianhua(网络过客)回复于 2006-11-11 11:04:50 得分 0

a=a+b  
  b=a-b  
  a=a-bTop

47 楼freeman868(回头浪子 ^ - ^)回复于 2006-11-11 11:10:50 得分 0

void   swap1(int*   a,   int*   b)  
  {  
  *a   =   (*a)^(*b);  
  *b   =   (*a)^(*b);  
  *a   =   (*a)^(*b);  
  }  
   
  void   swap2(int&   a,   int&   b)  
  {  
  a   =   a^b;  
  b   =   a^b;  
  a   =   a^b;  
  }  
   
  void   swap3(int*   a,   int*   b)  
  {  
  *a   =   (*a)+(*b);  
  *b   =   (*a)-(*b);  
  *a   =   (*a)-(*b);  
  }  
   
  void   swap4(int&   a,   int&   b)  
  {  
  a   =   a+b;  
  b   =   a-b;  
  a   =   a-b;  
  }  
   
  void   main()  
  {  
  int   A   =   10,   B   =   99;  
   
  swap1(&A,   &B);  
  printf("A:   %d\nB:   %d\n",   A,   B);  
  swap2(A,   B);  
  printf("A:   %d\nB:   %d\n",   A,   B);  
  swap3(&A,   &B);  
  printf("A:   %d\nB:   %d\n",   A,   B);  
  swap4(A,   B);  
  printf("A:   %d\nB:   %d\n",   A,   B);  
   
  }Top

48 楼YUNSHI0123(叶子的离去,是因为风的追求,还是树的不挽留?)回复于 2006-11-11 11:30:02 得分 0

a   =   a^b;  
  b   =   a^b;  
  a   =   a^b;Top

49 楼rongcanf(沉默是猪。)回复于 2006-11-11 11:39:06 得分 0

a=a^b^a^b;Top

50 楼rongcanf(沉默是猪。)回复于 2006-11-11 11:40:01 得分 0

错了  
  a=a^=b^=a^=b;Top

51 楼rongcanf(沉默是猪。)回复于 2006-11-11 11:44:28 得分 0

有错了     呵呵  
  a^=b^=a^=b;Top

52 楼hyg2008(蓝色雨)回复于 2006-11-11 12:19:51 得分 0

楼上的全部错了!  
  看看下面这样会出什么问题?  
  int   mian()  
  {  
      int   a;  
      pa   =   &a;  
      pb   =   &a;  
      swap(pa,   pb);  
   
      reurn   0;  
  }  
  所以在swap里面还应该检查pa和pb是否相等。Top

53 楼viornment()回复于 2006-11-11 12:20:39 得分 0

楼上的解法本来就容易犯错误,呵呵!  
  Top

54 楼hyg2008(蓝色雨)回复于 2006-11-11 12:20:44 得分 0

上面少定义了pa,明白意思就行了Top

55 楼zerohk(零度空间)回复于 2006-11-11 14:22:50 得分 0

顶者有分Top

56 楼thinkSJ()回复于 2006-11-11 17:14:05 得分 0

应该是可以用栈或寄存器的Top

57 楼lujun5100(笑笑)回复于 2006-11-11 17:48:03 得分 0

不错  
  楼上有很多都是错地,大家要自己验证一下  
  不要被别人弄糊涂了Top

58 楼kelvin_yin(康熙)回复于 2006-11-11 18:02:48 得分 0

弱弱的问一句:这种问题在实际应用中有什么作用?Top

59 楼LifeAndC(蓝色忧郁)回复于 2006-11-11 18:17:52 得分 0

这样的单位不用去了。Top

相关问题

关键词

得分解答快速导航

  • 帖主:lusanchao

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo