一、开辟空间暂存法
两个值想要交换,不能用a=b,b=a来进行交换。
#include<stdio.h>
int main()
{
int a=10,b=8;
a=b;
b=a;
printf("%d %d",a,b);
return 0;
}
这样输出结果就是错误的:
为什么会这样呢?
因为在计算机中a,b都是变量,都有一个动态空间,10存储在a的空间中,8存储在b中的空间中,当a=b时,就是把b中的数值,赋值给a,a此时空间存储的就变成8(a=8),C语言执行语句是一步步执行的,所有b=a在a=b后,所以此时把a=8赋值给b,此时b=8,相当于没变。
此时可以想象有两瓶饮料,要把两种饮料交换瓶子A,B,有什么办法呢?那只能再拿一个空瓶子C,然后把一种饮料A放在空瓶子C里暂存着,把第二种饮料B倒进刚刚空出来的第一种饮料的瓶子A里,最后把放在空瓶子C里的第一种饮料倒进第二种饮料的瓶子B里。
类似,在写程序时可以开辟一个新的变量空间来暂存其中一个变量,使这个变量值不会缺失。
#include<stdio.h>
int main()
{
int a=10,b=8,c;
c=a;
a=b;
b=c;
printf("%d %d",a,b);
return 0;
}
其中,c就是开辟的新空间,此时有电脑的可以进行debug(调试),对a、b、c三个变量的值进行监视。最终结果就是是对的。
二、总和加减交换法
交换时可以把两个数相a,b加,赋值给一个变量a,然后另一个变量b就可以用a-b来赋值,来达到b得到原来a的值,最后再把和减去b的值来赋值给a,这种方法可以减少空间的使用。
例:a=8,b=10,然后把a+b=18->a,此时a=18,b=10,a-b=8->b,这样b就得到了a(8)的值,最后a-b-=10>a,a就得到原来b的值(10)。
代码展示:
#include<stdio.h>
int main()
{
int a=8,b=10;
a=a+b;
b=a-b;
a=a-b;
printf("%d %d",a,b);
return 0;
}
结果如下:
三、按位异或交换法
^这个符号在C语言中不再是幂函数符号,而是逻辑运算符按位异或。
执行原理:两个十进制数转换为二进制数,然后两个作比较,如对应数为相等,则结果为0,不同则为0,最后再把结果的二进制数转换为十进制数。
例:a=8,b=10。
a转换为二进制数为1000,b转化为二进制数为1010,a^b=0010
利用这个原理怎么进行两个数交换呢?
还是拿上面的例子举例:
a^b=0010,那此时只需要再用一次^就可以进行交换。现在进行。
a^b=0010->a,接着a^b=1000->b(a=0010,b=1010),a^b=1010->a(a=0010,b=1000),这样就达到交换的目的。
#include<stdio.h>
int main()
{
int a=8,b=10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d",a,b);
}
结果如下:
注意:如果要写函数进行交换,要不要直接传值,要使用指针进行地址传递。