题目:交换两个int变量的值,不能使用第三个变量,即a=3,b=5交换后a=5,b=3。
方法一:加减
a = a + b; b = a - b;a = a - b;
#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;b = a ^ b;a = a ^ b;
#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;*/
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后a=%d,b=%d\n",a,b);
return 0;
}
那么问题来了,这两种方法说更好呢?
方法一会存在整型溢出问题,如果我们将a和b都取接近int所能存储的极限时,那么a=a+b就会溢出。相反方法二不会溢出。但在实际运用在,会采用第三变量的方法,代码可读性高,执行效率高。异或操作可读性差,执行效率低于其他方法。
#include<stdio.h>
int main(){
int a = 21;
int b = 22;printf("交换前a=%d,b=%d\n",a,b);
int temp = a;
a = b;
b = temp;printf("交换后a=%d,b=%d\n",a,b);
return 0;
}