实现两个数交换,我们最常用的应该就是创建第三个变量,进行交换
如下
#include <stdio.h>
int main()
{
int a = 2;
int b = 5;
int c;
c = a;
a = b;
b = c;
printf("a=%d, b=%d", a, b);
return 0;
}
那么,下面我们就要思考如何不创建第三个来实现交换,如此可能会想到这段代码:
#include <stdio.h>
int main()
{
int a = 2;
int b = 5;
a = a + b;
b = a - b;
a = a - b;
printf("a=%d, b=%d", a, b);
return 0;
}
但这段带码不合适:若a、b均很大且刚好未超出整型范围,但a+b超出了整型范围,就会导致数据丢失,不适用于全部的数。存在bug
用异或(^)来求,上代码
#include <stdio.h>
int main()
{
int a = 2;
int b = 5;
a = a ^ b;
b = a ^ b; //b = a^b^b = a^0 = a
a = a ^ b; //a = a^a^b = 0^b = b
printf("a=%d, b=%d", a, b);
return 0;
}
原理:
我们知道异或运算中:相同为0,相异为1
那么:a^a=0,a^0=a
则上段代码中的
b = a^b = a^b^b = a^0 = a
a = a^b = a^a^b = 0^b = b 实现互换
当然,除了题目的特殊要求,我们一般写这道题时还是用创建变量的方法来做,这种方法的效率更高,代码的可读性更强。