C语言--交换两个整型变量(四种方法)
法1:引入中间变量
代码如下
#include <stdio.h>
int main1()
{
int a = 0;
int b = 0;
int tmp = 0;
printf("请输入a和b:");
while (scanf("%d %d", &a, &b)!=EOF)//多组输入
{
printf("交换前a=%d b=%d\n", a, b);
tmp = a;
a = b;
b = tmp;
printf("交换后a=%d b=%d\n\n", a, b);
printf("请输入a和b:");
}
return 0;
}
法2:使用按位异或操作符^
按位异或操作符
^
用法:对应的二进制位相同则为0,相异则为1<注意>
- 这里的二进制是
补码
(整数在计算中存储和运算通常采用的是补码,因为补码可将符号位和数值域统一处理)在运算后要转换为原码再转为整型十进制- 正数:原反补相同
- 负数:原码除符号位取反变为反码,反码最后一位加一变为补码
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
printf("请输入a和b:");
while (scanf("%d %d", &a, &b) != EOF)
{
printf("交换前a=%d b=%d\n", a, b);
a = a ^ b;//a^a==0 0^a==a 按位异或满足交换律
b = a ^ b;//a^b^b==a 所以b=a
a = a ^ b;//a^b^a==b 所以a=b
printf("交换后a=%d b=%d\n\n", a, b);
printf("请输入a和b:");
}
return 0;
}
法3:加和
缺点是当输入的两个数都很大的时候可能会超出int范围 造成结果不对
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
printf("请输入a和b:");
while (scanf("%d %d", &a, &b) != EOF)
{
printf("交换前a=%d b=%d\n", a, b);
a = a + b;
b = a - b;//相当于a+b-b b变成a了
a = a - b;//相当于a+b-a a变成b了
printf("交换后a=%d b=%d\n\n", a, b);
printf("请输入a和b:");
}
return 0;
}
法4:传址调用
#include <stdio.h>
void Swap(int* pa, int* pb)
{//当实参传递给形参时,形参是实参的一份临时拷贝,对形参的修改不会影响实参
//因此引入了传址调用 可让函数与主调函数之间建立真正的联系
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 0;
int b = 0;
int tmp = 0;
printf("请输入a和b:");
while (scanf("%d %d", &a, &b) != EOF)
{
printf("交换前a=%d b=%d\n", a, b);
Swap(&a, &b);//传址调用
printf("交换后a=%d b=%d\n\n", a, b);
printf("请输入a和b:");
}
return 0;
}
创作不易,希望大家多多支持,有什么问题欢迎讨论🌹🌹