在c语言编程中,我们经常会对两个变量进行交换,一般我们都会采用创建第三个临时变量的方法进行交换,如下:
int t = 0;
t = a;
a = b;
b = t;
那么是否可以不进行第三临时变量的创建来完成两个变量的交换呢?曾有一道面试题就考到了这个。下面介绍两种方法,各有优劣。
1、通过两个数互相加减来完成
假如仍对啊a,b进行交换,我们可以先将a与b的值相加,得到的和赋值给a,再由a+b的总和即现在的a减去b的值就得到了a的值再将这个值赋给b,这时b里面装的就是a的值了,再由a+b的总和,即a现在的值减去b(现在装着a的值),就得到了b的值,再赋给a,就完成了a与b两个变量的交换。如下:
a = a + b;
b = a - b;
a = a - b;
除了先得到和,同理,也可以先进行相减,得到差值,如下:
b = a - b;
a = a - b;
b = a + b;
但是这种方法存在缺陷,那就是第一步相加(或相减)后得到的值可能超出定义类型的范围。
2、通过异或进行交换
异或的运算是在二进制的条件下完成的,异或的符号是:^,运算法则是:相同为0,相异为1举个例子:
这里我们进行探究就可以发现:
将4 ^ 3 ^ 4交换顺序得到:4 ^ 4 ^ 3=3,可知异或满足交换律。
有了这个发现,我们便能完成不创建临时变量来实现两个变量的交换了,如下:
#include<stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);//输入:4 3
a = a ^ b;
b = a ^ b;//这里相当于b = a ^ b ^ b = a(将上面a的值带入得到)
a = a ^ b;//这里相当于a = a ^ b ^ a = b(等号后面的a为a ^ b,b为a)
printf("%d %d", a, b);//输出:3 4
return 0;
}
这种方法也具有缺点:
1、只能用于整数交换
2、代码的可读性差
3、代码执行的效率也低于使用临时变量的方法
3、总结
这两种方法相较于使用临时变量的方法都具有一定的局限性,除了有这种特殊要求的情况下,我们一般还是采用临时变量的方法来进行两个变量的交换。