C语言可不可以实现交换三两个变量交换值的值(不借助第四两个变量交换值)

1411人阅读
C语言入门(3)
通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下:
a=10; b=15;
t=a; a=b; b=t;
这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。
上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用三种算法来实现:1)算术运算;2)指针地址操作;3)位运算;4)栈实现。
1) 算术运算
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
缺点:是只能用于数字类型,字符串之类的就不可以了。a+b有可能溢出(超出int的范围),溢出是相对的, +了溢出了,-回来不就好了,所以溢出不溢出没关系,就是不安全。
2) 指针地址操作
因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。即:
int *a,*b; //假设
*a=new int(10);
*b=new int(20); //&a=0xh,&b=0xh
a=(int*)(b-a); //&a=0xh,&b=0xh
b=(int*)(b-a); //&a=0xh,&b=0xh
a=(int*)(b+int(a)); //&a=0xh,&b=0xh
通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在?
首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。在编译源程序时,常量、全局变量等都放入全局数据区,局部变量、动态变量则放入堆栈区。这样当算法执行到“a=(int*)(b-a)”时,a的值并不是0xh,而是要加上变量a所在内存区的基地址,实际的结果是:0x008f0200h,其中0x008f即为基地址,0200即为a在该内存区的位移。它是由编译器自动添加的。因此导致以后的地址计算均不正确,使得a,b指向所在区的其他内存单元。再次,地址运算不能出现负数,即当a的地址大于b的地址时,b-a&0,系统自动采用补码的形式表示负的位移,由此会产生错误,导致与前面同样的结果。
有办法解决吗?当然!以下是改进的算法:
文章:53篇
阅读:15707
文章:21篇
阅读:5224
文章:27篇
阅读:8654
文章:13篇
阅读:4226
阅读:1911
阅读:2273
文章:14篇
阅读:3284欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 5039 人关注过本帖
标题:交换两个数字,不引入第三个变量的方法
等 级:新手上路
帖 子:79
&&问题点数:0&&回复次数:36&&&
交换两个数字,不引入第三个变量的方法
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include&stdio.h&
void main()
&&& int x,y;
&&& printf(&please input x,y:\n&);
&&& scanf(&%d%d&,&x,&y);
&&& printf(&x=%d,y=%d\n&,x,y);
&&& y=x-y;
&&& printf(&x=%d,y=%d\n&,x,y);
[[it] 本帖最后由 bianchengfeng 于
12:12 编辑 [/it]]
搜索更多相关主题的帖子:
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
燕子 ,又看见你了。。。lz你的程序需要数不能太大。。要不相加就溢出了
学习需要安静。。海盗要重新来过。。
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
恩。。。这个我还没注意呢。。lz要注意这个问题哦。。。用位运算要好点
学习需要安静。。海盗要重新来过。。
等 级:新手上路
帖 子:79
回复 4# かわい 的帖子
呵呵,不好意思了
不知道怎么搞的
加上前面一段代码
等 级:新手上路
帖 子:79
回复 5# sunkaidong 的帖子
还不懂位运算
来 自:湖北工业大学
等 级:贵宾
威 望:19
帖 子:3947
专家分:748
很好……见过这个代码。
但是注意,只适用数字,而且不能太大……
专心编程………
飞燕算法初级群:3996098
来 自:湖北工业大学
等 级:贵宾
威 望:19
帖 子:3947
专家分:748
还有,飞燕不要那么小家子气嘛……
专心编程………
飞燕算法初级群:3996098
来 自:WindRiver
等 级:论坛游民
帖 子:859
专家分:68
为什么不能太大?
不要想当然,说这么外行的话。
为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
等 级:新手上路
帖 子:560
LZ定义的不是int吗?是不能有多大的数据啊
来 自:湖北工业大学
等 级:贵宾
威 望:19
帖 子:3947
专家分:748
因为add针对dword,也就是32位。
int也是32位。
如果超过了,会溢出。
我没有看过关于“add指令如果超过32位,使用edx存储高位”之类的描述
虽然mul指令的确是这样的。
但是,的确发现在C里面,计算临时引入的变量超过了INT_MAX的。
不过只超过了一点点,只是当是引入了进位标准的特殊现象而已。
Vx说明一下?
专心编程………
飞燕算法初级群:3996098
版权所有,并保留所有权利。
Powered by , Processed in 0.076608 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved> 博客详情
摘要: 考试时遇到这个奇葩题,百度了一下异或的原理,贴上来
通常的交换两个变量a,b的过程为
需借助上面的第3个临时变量temp.
采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量:
&&& a = a ^&&& b = a ^&&& a = a ^
这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质:
1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0
2.任意一个变量X与0进行异或运算,结果不变,即X^0=X
3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)
4.异或运算具有可交换性,即a^b=b^a
第一步:&&& a = a ^
完成后 a变量的结果为a ^ b
第二步:&&& b = a ^
此时赋值号右边的a保存的是a ^ b的值,那么将赋值号右边的a用a ^ b替换,
得到(a ^ b) ^ b=a ^ (b ^ b)=a ^0=a,
即经过第二步运算后b中的值为a,即b=a,将a换到了b里
第三步:&&& a = a ^
此时赋值号右边的a保存的仍然是a ^ b的值,不变,而赋值号右边的b已经是a 了,
将赋值号右边的a,b分别进行替换,
即此时赋值号右边a ^ b=(a ^ b)^ a=a ^ b^ a=a ^ a^ b=0^ b=b, 该值赋值给a,即a=b
即经过第三步运算后a中的值为b,即a=b,将b换到了a里
这样经过如上的三步骤,完成了交换两个变量a,b而无需借助第3个临时变量过程。
这个过程等价于如下的过程,:
前提是a+b的值不能溢出。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥给出int型的x、 y两个数,要求不借助第三个变量交换x和y的值,如何编程实现_百度知道
给出int型的x、 y两个数,要求不借助第三个变量交换x和y的值,如何编程实现
我有更好的答案
int x = 1;int y = 2;x = x +y = x -x = x -这样就把x和y的值互换了
采纳率:62%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 java交换两个变量的值 的文章

 

随机推荐