目录
创建一个临时变量tmp,先将其中一个变量a存放在临时变量tmp中,此时变量a的值则可被替换为变量b,然后再将b的值替换为tmp,此时变量a和变量b的值借助于变量tmp就完成了交换
代码如下(以a、b为整型变量为例):
- #include
- 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
- 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变量进行交换即可