第一种:创建一个临时变量来交换数值
代码如下;
int main()
{
int a, b;
scanf("%d%d", &a, &b);
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;
}
第二种:利用加减法来交换
但是这里有一个弊端那就是 当两个数据都接近数据极限时再相加会导致溢出从而数据丢失
代码如下
int main()
{
int a, b;
scanf("%d%d", &a, &b);
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=a;a^0=a;
其实异或就是看二进制位有没有区别通过位运算时 不同为1 相同为0 ;
还有一个性质就是
a^a^a^b=a^b;
相同的就相当于干掉 a干掉a还剩一个a;当然还有交换律 和结合律 ;
代码如下;
int main()
{
int a, b;
scanf("%d%d", &a, &b);
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;
b = a ^ b;
a = a ^ b;
第一行 a = a ^ b;
第二行 b = a ^ b=a^b^b;b和b会同归与尽所以只剩了a;此时b==a;
第三行 a = a ^ b=a^b^a;a和a会同归与尽所以只剩了b;此时a==b;
至此完成交换
到这里大家想想怎么才能不创建临时变量来完成让两个数相加呢?
总结三种方法的效率 第一种是做好,第三种次之,第二种最后;