一般情况,我们使用交换两个数的方法是:引入一个临时变量来进行数的交换
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
printf("交换前:%d %d\n",a,b);
int temp = a;
a = b;
b = temp;
printf("交换后:%d %d\n",a,b);
return 0;
}
还有一种不需要使用临时变量就能达到交换数的目的:使用加减法
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
printf("交换前:%d %d\n",a,b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后:%d %d\n",a,b);
return 0;
}
但这种方法存在溢出的可能 即:int 类型为4字节 = (4*8 )32 位 可表示范围为 -2,147,483,648 到 2,147,483,647 (无符号:2^32 = 4,294,967,296 有符号:-2^32/2~-1 0~2^32/2-1)
使用乘除法 ,需注意避免除数为零的情况 除数不能为零
#include <stdio.h>
int main()
{
int a = 5;
int b = 3;
printf("交换前:%d %d\n",a,b);
a = a * b;
b = a / b;
a = a / b;
printf("交换后:%d %d\n", a, b);
return 0;
}
一种常见的方法是使用位操作来交换变量的值,这种方法利用了异或的特性:对于两个相同的值进行异或运算,结果为0。而对于不同的值进行异或运算,结果为非零值。通过多次异或运算,可以实现变量值的交换。
#include <stdio.h>
//不创建临时变量实现两个数的交换
//0 ^ a = a
//a ^ a = 0
//a^b^a = b
int main()
{
int a = 5;
int b = 3;
printf("交换前:%d %d\n",a,b);
a = a ^ b;//0000 0000 0000 0000 0000 0000 0000 0101 ^ 0000 0000 0000 0000 0000 0000 0000 0011 -> 0000 0000 0000 0000 0000 0000 0000 0110 = 6
b = a ^ b;// 0110 -> 0101 = 5
a = a ^ b;//0000 0000 0000 0000 0000 0000 0000 0110 ^ 0101 -> 0011 = 3
printf("交换后:%d %d\n", a, b);
return 0;
}
补充:
异或(相同为 0,不同为1)操作符支持交换律:a^b^a = b a^a^b = b
位操作符:&(按位与) |(按位或) ^(按位异或) 的操作数有局限性必须是整数