今天老师讲课提出一个“不创建第三变量进行数据交换”,作为大三狗,这是上课做的笔记:
使用其中一个变量用来存储:
#include<stdio.h>
int main(void){
int a=1,b=2;
a=a+b;
b=a-b;
a=a-b;
printf("a=%d a=%d",a,b);
return 0;
}
TIPS:其中的a与b两个变量的赋值顺序不可改变。除非:
#include<stdio.h>
int main(void){
int a=1,b=2;
b=a+b;
a=b-a;
b=b-a;
printf("a=%d a=%d",a,b);
return 0;
}
这样交换是有缺陷的,假如交换的数字相加超过了int类型所表示的范围,相加就会溢出,这样交换就会出现差错。
使用异或操作:
#include<stdio.h>
int main(){
int a=1,b=2;
a=a^b;
b=a^b;
a=a^b;
printf("a=%d b=%d",a,b);
return 0;
}
解释: a:原码:0000 0001 补码:0000 0001
b:原码:0000 0010 补码:0000 0010
计算机计算使用的是:补码
( ^ 操作是按位比较,不同则为1,相同为 0)
a=a^b; 0001 ^ 0010 =0011
b=a^b; 0011 ^ 0010 =0001
a=a^b; 0011 ^ 0001 =0010
大家可以欣赏一下这位博主的文章,很详细:https://blog.csdn.net/job_dinge/article/details/9949519