[硬核快餐]C语言 交换两变量值的六种方法

1创建中间变量

这是最快也是最简单的办法

#include<stdio.h>
 
int main()
{
    int a=10;
    int b=20;
    int temp;
    printf("交换前a,b的值为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    temp=b;
    b=a;
    a=temp;
    printf("交换后a,b的值为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}

2 函数交换法

调用函数交换两个数的值

#include<stdio.h>
 
void swap(int *p1,int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
 
int main()
{
    int a=10;
    int b=20;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    swap(&a,&b);
    printf("交换后a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}

3用加减或乘除运算来交换

#include<stdio.h>
 
int main()
{
    int a=10;
    int b=20;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    a=a+b;   //a=a*b;
    b=a-b;   //b=a/b;
    a=a-b;   //a=a/b;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
}

注意:这两种方法容易越界,使用时应谨慎。

所以这种方法是有缺陷的,那有没有类似的不溢出的方法呢?答案是肯定的,有。下面就来看这种不溢出的方法。

4异或交换法(当a,b相等时,不可用)

掌握这种方法,就要知道什么叫异或。异或:一般是针对二进制数来说的,它的规则就是如果两个二进制数不相同,则异或结果为1;否则,异或结果为0。
这种方法看着和第三种很类似,但却比它更严谨。为什么这么说,因为上面说了,加减乘除这种方法很能会产生溢出错误,而异或却完全不会。因为两个二进制数异或的结果只能是0或1,不会产生进位或借位,不会超出变量的表示范围。

#include<stdio.h>
 
int main()
{
    int a=10;
    int b=20;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    a=a^b;
    b=a^b;
    a=a^b;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
}

5用位运算交换

最后,介绍一种高逼格的方法,很少人会想到。__int64表示64位整型变量,这个在VC6.0里是支持的。
b = (__int64)((__int64)a << 32 | (a = b)) >> 32;这个语句中a=b的值为b的值20,同时把b的值赋给a。整个语句的意思:先把a强制转化为64位整型变量,然后把它左移32位后与(a=b)按位或,把整个结果再强制转换为64位整型变量,然后右移32位得到b的值。其实,求b的值没必要有|(a=b)这部分,但因为想同时把b的值赋给a,且把|(a=b)放在这儿不会影响到b最终的值,所以写成这样。这儿就采用移位的方法避免了用中间变量。


```c
#include<stdio.h>
 
int main()
{
    int a=10;
    int b=20;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    b = (__int64)((__int64)a << 32 | (a = b)) >> 32;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}

6指针交换法
解释:这种方法是利用到指针进行交换,初学者未学到指针的可以先看看,或之后再回来看。

#include<stdio.h>
int main(void)
{
     int a=1,b=2;
     int &ptr_a=a,&ptr_b=b;
     int tep;
     
     tep=*ptr_a;
     *ptr_a=*ptr_b;
     *ptr_b=tep;
     
     printf("%d %d",a,b);
     return 0;
 }

(本文转载于网络文章+个人补充)

ps:另外公众号(同年新月)开了一个月了才刚刚过百的同年关注我,真是让我好伤心啊…求同年们给自己的小伙伴分享一下啊,一起来努力呀!
公众号中有大量经典的编程书籍电子版,同时我每周会总结学习过程中的重难点,同年们也可积极投稿,入选者有奖励啊(比如经典书籍等),一起来努力啊!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值