不创建临时变量实现两个数的交换(c)

一般情况,我们使用交换两个数的方法是:引入一个临时变量来进行数的交换

#include <stdio.h>


int main()
{
    int a = 1;
    int b = 2;
     
    printf("交换前:%d %d\n",a,b);

    int temp = a;
        a = b;
        b = temp; 

    printf("交换后:%d %d\n",a,b);   

    return 0;
}

还有一种不需要使用临时变量就能达到交换数的目的:使用加减法

#include <stdio.h>


int main()
{
    int a = 1;
    int b = 2;
     
    printf("交换前:%d %d\n",a,b);

    a = a + b;
    b = a - b;
    a = a - b;
        

    printf("交换后:%d %d\n",a,b);   

    return 0;
}

但这种方法存在溢出的可能 即:int 类型为4字节 = (4*8 )32 位 可表示范围为 -2,147,483,648 到 2,147,483,647 (无符号:2^32 = 4,294,967,296  有符号:-2^32/2~-1  0~2^32/2-1)

使用乘除法 ,需注意避免除数为零的情况        除数不能为零


#include <stdio.h>

int main()
{
    int a = 5;
    int b = 3;
    
    printf("交换前:%d %d\n",a,b);

    a = a * b;
    b = a / b;
    a = a / b;   

    printf("交换后:%d %d\n", a, b);

    return 0;
}

一种常见的方法是使用位操作来交换变量的值,这种方法利用了异或的特性:对于两个相同的值进行异或运算,结果为0。而对于不同的值进行异或运算,结果为非零值。通过多次异或运算,可以实现变量值的交换。


#include <stdio.h>

//不创建临时变量实现两个数的交换

//0 ^ a = a
//a ^ a = 0
//a^b^a = b

int main()
{
    int a = 5;
    int b = 3;
    
    printf("交换前:%d %d\n",a,b);

    a = a ^ b;//0000 0000 0000 0000 0000 0000 0000 0101 ^ 0000 0000 0000 0000 0000 0000 0000 0011 -> 0000 0000 0000 0000 0000 0000 0000 0110 = 6
    b = a ^ b;//                                                                             0110 ->                                    0101 = 5
    a = a ^ b;//0000 0000 0000 0000 0000 0000 0000 0110 ^                                    0101 ->                                    0011 = 3

    printf("交换后:%d %d\n", a, b);

    return 0;
}

补充:

异或(相同为 0,不同为1)操作符支持交换律:a^b^a = b       a^a^b = b

位操作符:&(按位与)        |(按位或)        ^(按位异或)        的操作数有局限性必须是整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值