(一)创建临时变量
首先最直观最简单实现两变量值互换的方法是创建临时变量,把其中一个值放在临时变量中去,最后再放回来。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;//创建临时变量c,用于存放a,b中的一个值
scanf("%d%d", &a, &b);
c = a;//把a赋值给c
a = b;//将b赋值给a,此时a的值已经被覆盖,但我们有保存a的值的临时变量c
b = c;//最后将c赋值给b,其实也就是原本的a赋值给b。这是方法一
printf("%d %d\n", a, b);
return 0;
}
(二)运用位运算符^
按位异或的特点是一个数按位异或自己为零,一个数按位异或零还为自己。即a^0==a,a^a==0。我们可以利用这个特点来进行变量值的互换
define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;//创建临时变量c,用于存放a,b中的一个值
scanf("%d%d", &a, &b);
//方法二
a = a ^ b;
b = a ^ b;//此时b==a^b^b。 其中b^b==0 然后0^a ==a;
a = b ^ a;//同样的道理a=a^b^a 其中a^a==0 然后0^b==a
printf("%d %d\n", a, b);
return 0;
}
(三)不使用临时变量的加减法
与方法二一样的原理,利用加减法的运算
define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;//创建临时变量c,用于存放a,b中的一个值
scanf("%d%d", &a, &b);
//方法三
a = a + b;
b = a - b;//b = a+b-b 此时b==a
a = a - b;//a== a + b- (a+b-b)
printf("%d %d", a, b);
return 0;
}
(四)通过子函数运用地址
主函数传参数并不是把实际的值,即实参,传到子函数去。而是相当于复制粘贴,赋给了新的一模一样的值,即形参。这两个值的地址并不相同。所以一般如果不用地址,我们难以修改主函数的变量的值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Change_number(int* pa,int* pb)
{
int c = 0;
c = *(pa);//解引用pa的地址,将pa指向的值a赋值给c
*(pa) = *(pb);//跟方法一同理,解引用pb的地址,将pb指向的值b赋值a
*(pb) = c;//最后再将存在a的值的c赋值给b
}
int main()
{
int a = 0;
int b = 0;
int c = 0;//创建临时变量c,用于存放a,b中的一个值
scanf("%d%d", &a, &b);
//方法四
Change_number(&a, &b);
printf("%d %d", a, b);//然后打印a,b的值
return 0;
}
(五)作者想说的话
建议多多思考这四个方法的原理,由来。然后自己动手敲一遍代码,这样才算学会。我是しかし,我们下次再见!