交换两个变量的值,用第三变量,用函数

看到这个题目我想到方法是用第三变量交换,代码如下:

#include<stdio.h>
int main()//这是用第三变量交换,这种效率是最高的
{
	int a=3;
	int b=5;
	int tmp=0;
	tmp=a;
	a=b;
	b=tmp;
	printf("a=%d,b=%d\n",a,b);
	return 0; 
}
当老师说用函数的方式写出来的时候,我写出了以下代码:
#include<stdio.h>
void swap(int x,int y)
{
         int tmp=x;
         x=y;
         y=tmp;
}
int main()
{
        int a=3;
        int b=5;
        swap(a,b);
        printf("a=%d,b=%d\n",a,b);
        return 0;
}
 
很自信我写的是对的,可惜事实证明那是错误的,这个运行结果是a=3,b=5 a和b的值并没有交换。分析一下,swap(a,b)只是将a,b的值传给x,y;在void swap(int x,int y)函数中,只是将x,y的值改变了,并没有将a,b的值改变。
在老师讲过之后,我总结了以下几种方法:
int main()//这里是用加法的方式进行交换,还可以用乘的方式进行交换,但有局限性,加法 乘法会越界,有0的时候也不可以用乘法
{
	int a=3;
	int b=5;
	a=a+b;
	b=a-b;
	a=a-b;
	printf("a=%d,b=%d\n",a,b);
	return 0;</span>
}
 
int main()//用与或的方式将两个变量的值交换
{
	int a=3;
	int b=5;
	a=a^b;
	b=a^b;
	a=a^b;
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
</pre><pre code_snippet_id="1697565" snippet_file_name="blog_20160526_11_5547133" name="code" class="csharp">
 
当然也可以用指针的方式,代码基本上差不多:
int main()//用指针的方式进行交换(引入第三变量)
{
	int a=3;
	int b=5;
	int *p;
	int *q;
        p=&a;
        q=&b;
	int tmp;
	tmp=*p;
	*p=*q;
	*q=tmp;
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
 
int main()//指针加法
{
	int a=3;
	int b=5;
	int *p;
	p=&a;
	int *q;
	q=&b;
	*p=*p+*q;
	*q=*p-*q;
	*p=*p-*q;
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
 
int main()//指针与或
{
	int a=3;
	int b=5;
	int *p;
	int *q;
        p=&a;
	q=&b;
	*p=*p^*q;
	*q=*p^*q;
	*p=*p^*q;
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
 
int main()//指针乘法
{
	int a=3;
	int b=5;
	int *p;
	p=&a;
	int *q;
	q=&b;
	*p=*p*(*q);
	*q=*p/(*q);
	*p=*p/(*q);
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
 
下面是用函数的方式实现:</span>
void swap(int *x,int *y)//第三变量
{
	int tmp;
	tmp=*x;
	*x=*y;
	*y=tmp;
}
int main()
{
	int a=3;
	int b=5;
	swap(&a,&b);//传参
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
<span style="font-family: Arial, Helvetica, sans-serif;"> void swap(int *x,int *y)//加减法</span>
{
	*x=*x+*y;
	*y=*x-*y;
	*x=*x-*y;
}
int main()
{
	int a=3;
	int b=5;
	swap(&a,&b);
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
 
void swap(int *x,int *y)//乘除
{
	*x=*x**y;
	*y=*x/(*y);
	*x=*x/(*y);
}
int main()
{
	int a=3;
	int b=5;
	swap(&a,&b);
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
 
void swap(int *x,int *y)//与或
{
	*x=*x^*y;
	*y=*x^*y;
	*x=*x^*y;
}
int main()
{
	int a=3;
	int b=5;
	swap(&a,&b);
	printf("a=%d,b=%d\n",a,b);
	return 0;
}

初学者,有错误的地方请指出,谢谢!

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值