把两个数互相交换的三种方法——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;
}

程序运行结果如下:

把两个数互相交换的三种方法——C语言

那这又是为什么呢?

原因是因为我们采用了传址传递的方法,而形参的类型为int型的指针(int*).

方法二中:

把两个数互相交换的三种方法——C语言

当进行第一步运算  *p=*p+*q时,b的值变为20

把两个数互相交换的三种方法——C语言

而当进行*q=*p-*q时,b=20-20=0,即此时b的值为0

把两个数互相交换的三种方法——C语言

所以*p=*p-*q可看为b=0-0=0,所以最终b的值变为0.

方法三种:

同样

把两个数互相交换的三种方法——C语言

当进行*p=*p ^ *q运算时,因为一个数异或它自身为0,所以此时c的值变为0

把两个数互相交换的三种方法——C语言

所以后面的两步计算也就变为了c=0^0,最终结果是c=0.

 

所以为了保险起见,我们通常采用第一种方法来交换两个数的数值。