浅谈两数值交换的解决办法

<pre name="code" class="cpp">

浅谈两数值交换

吐舌头一.问题分析:

        基于这个问题我们可以采用创建临时值和直接对两数进行运算两种方式去解决问题.小编就不啰嗦了,直接贴代码和大家分享喽!
 1)创建临时值
 (1)方式一:传值方式(不可取方式)
void _swap1(int x,int y)
{
	int tmp=x;  //tmp为临时值,后面不再说明
	x=y;
	y=tmp;
}
int main()
{
	int a=1;
	int b=0;
	_swap1(a,b);
	cout<<"a="<<a<<" "<<"b="<<b<<endl;
	getchar();
	return 0;
}
运行结果:

当我们对代码进行测试时发现,a和b值并没有发生交换,调试时发现:函数只对形参的值进行了交换,我们传入的实参值并没有发生变化,因为每个形参的地址和与其对应的每个实参的地址是彼此独立的,该方法不可取。(下图可得出结论)

 (2)方式二:传指针方式,交换指针变量值方式
void _swap2(int* x,int* y)
{
	int tmp=*x;
	*x=*y;
	*y=tmp;
}
采用这种方式我们发现,两值进行了交换,因为我们传入的是实参的地址,在内存中实参会随形参的值变化而变化;(下图可得出结论)


(3)方式三:传指针方式,交换指针方式
void _swap3(int* x,int* y)
{
	int *tmp=x;
	x=y;
	y=tmp;
}
(4)方式四:传引用方式
void _swap4(int& x,int& y)
{
	int tmp=x;
	x=y;
	y=tmp;
}
2)不创建临时值
 (1)方式一:两值加减法运算
void _swap5(int& x,int& y)
{
	x=x+y;
	y=x-y;
	x=x-y;
}
对这种方法,我们减少了创建临时值的麻烦,但是,当我们进行较大数据的交换时,上面的加法运算会产生位溢出,因此我们可以采用下面的位运算对其交换.
 (2)方式二:两值位运算
void _swap6(int& x,int& y)
{
	x=x^y;
	y=x^y;
	x=x^y;
}
那么就到这里,再见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值