把两个数互相交换的三种方法——C语言
一.设置一个中间变量t
方法如下:
#include<stdio.h>
void Swap1(int *p,int *q)//传址传递
{
int t;//中间变量
t=*p;
*p=*q;
*q=t;
}
二.利用a和b的加减运算关系
方法如下:
#include<stdio.h>
void Swap2(int *p,int *q)//传址传递
{
*p=*p+*q;
*q=*p-*q;
*p=*p-*q;
}
三.利用a和b的异或(^)关系
方法如下:
#include<stdio.h>
void Swap3(int *p,int *q)//传址传递
{
*p=*p ^ *q;
*q=*p ^ *q;
*p=*p ^ *q;
}
四.三种方法之间的比较
在这里我们推荐使用第一种方法,因为方法二和方法三,在自身和自身交换的情况下最终结果会变为0,这是一个bug.
例如:
#include<stdio.h>
void Swap1(int *p,int *q)//传址传递
{
int t;//中间变量
t=*p;
*p=*q;
*q=t;
}
void Swap2(int *p,int *q)//传址传递
{
*p=*p+*q;
*q=*p-*q;
*p=*p-*q;
}
void Swap3(int *p,int *q)//传址传递
{
*p=*p ^ *q;
*q=*p ^ *q;
*p=*p ^ *q;
}
int main()
{
int a=5;
int b=10;
int c=20;
Swap1(&a,&a);
printf("%d %d\n",a,a);
Swap2(&b,&b);
printf("%d %d\n",b,b);
Swap3(&c,&c);
printf("%d %d\n",c,c);
return 0;
}
程序运行结果如下:
那这又是为什么呢?
原因是因为我们采用了传址传递的方法,而形参的类型为int型的指针(int*).
方法二中:
当进行第一步运算 *p=*p+*q时,b的值变为20
而当进行*q=*p-*q时,b=20-20=0,即此时b的值为0
所以*p=*p-*q可看为b=0-0=0,所以最终b的值变为0.
方法三种:
同样
当进行*p=*p ^ *q运算时,因为一个数异或它自身为0,所以此时c的值变为0
所以后面的两步计算也就变为了c=0^0,最终结果是c=0.
所以为了保险起见,我们通常采用第一种方法来交换两个数的数值。