目录
常规实现两个数的交换(如:交换变量a和变量b)
方法一:加减法
方法二:异或操作符
常规实现两个数的交换(如:交换变量a和变量b)
创建一个临时变量tmp,先将其中一个变量a存放在临时变量tmp中,此时变量a的值则可被替换为变量b,然后再将b的值替换为tmp,此时变量a和变量b的值借助于变量tmp就完成了交换
代码如下(以a、b为整型变量为例):
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("交换前:a = %d; b = %d\n", a, b);
int tmp = a;
a = b;
b = tmp;
printf("交换后:a = %d; b = %d\n", a, b);
return 0;
}
代码验证如下:
那不能创建临时变量又该如何交换两个变量的值呢,方法如下:
方法一:加减法
代码如下:
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("交换前:a = %d; b = %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后:a = %d; b = %d\n", a, b);
return 0;
}
代码讲解:
a = a + b:先将a与b的和存放在a中
b = a - b:此时的a就为变量a、b的和,a减去b得到的就是a原来的值,然后赋值给b
a = a - b:此时的b为原来a的值,那么a减去b得到的就是原来b的值,最后赋值给a
这样就实现了变量a、b的交换
代码验证:
方法一的缺陷:
当变量a的值和变量b的值近乎于整型能表达的最大值时
此时a加上b的值就超出了整型能表示的最大值,再赋值给a的话就会发生截断
从而就达不到交换的效果
方法二:异或操作符
异或操作符相关的知识请见:按位与、或、异或操作符-CSDN博客
代码如下:
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("交换前:a = %d; b = %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a = %d; b = %d\n", a, b);
return 0;
}
异或操作符的相关运算
异或操作符运算规则:对应的二进制位相同为0,相异为1
a ^ a:得到的结果为0,因为对应的二进制位全相同
结论:任意整型变量自己异或自己时,得到的结果为0
a ^ 0:得到的结果为a
结论:任意整型变量异或0还是得本身
a ^ b ^ a:得到的结果为b
a ^ a ^ b:得到的结果为b
结论:异或操作符是支持交换律的
代码讲解:
由以上的结论即可推导出代码是如何实现的
a = a ^ b:将a ^ b存放在变量a中
b = a ^ b:此时的a为a ^ b,原代码可替换为:b = a ^ b ^ b,由以上结论就可得出b = a
a = a ^ b:此时的a还是为a ^ b,此时的b已经被赋值为了a,所以原代码可替换为:a = a ^ b ^ a,由以上结论就可得出a = b
代码验证:
方法二的优点:
不论变量a或者b为多么大的值,都不会产生溢出或者截断的情况
因为使用异或操作符操作的是二进制位,且不会出现进位的情况
总结:
方法二的可读性不高,且不易理解
所以在常规实现两个变量的交换时,使用创建tmp变量进行交换即可