问题->方案->实现: 交换2个变量

本文探讨了在C语言中如何不使用中间变量交换变量值的两种方法,包括异或运算和加法法,以及它们的优缺点和适用场景。作者指出异或运算看似不借助中间变量,实则通过计算过程间接存储,且可能带来额外的时间开销和代码复杂性。
摘要由CSDN通过智能技术生成

在很早以前,我遇见过一个题目,说C语言里如何不使用中间变量,来交换两个变量的值。

正常的变量交换:

void swap( int * a, int * b)

{

    int tmp;

    tmp = *a;

    *a = *b;

    *b = tmp;

}

而不用中间变量的方法:

void swap( int * a, int * b)

{

    *a = (*a)^(*b);

    *b = (*a)^(*b);

    *a = (*a)^(*b);

}

其中这种说法也是有问题的,虽然表面上没有使用中间变量,但引入了计算表达式,计算过程中一样需要存储计算结果。

而且为了减少这么一个中间变量,几个字节,程序变得很难理解了,不划算。

同时增加了计算,会增大时间开销,而且写成中间变量的交换,编译器也会进行优化,说不定中间变量也相当于没用。

这个问题的作用,其实只是为了研究问题而研究问题,一种理论上的探讨把。

使用异或这种运算方式,看起来很新奇而已。

实际上,给定两个数a和b,只要一种确定的函数关系,a和b唯一对应一个f(a,b),就可以用另一个函数关系来反推a,b的值。

比如:

首先三个函数关系:

f(a,b) = y,  g(y, b) = a,  h(y, a) = b

要实现交换则需要:

a = f(a, b) 

b = g(a, b)

a = h(a, b)

所以使用加法也一样:

void swap( int * a, int * b)

{

    *a = (*a)+(*b);

    *b = (*a)-(*b);

    *a = (*a)-(*b);

}

只不过异或的这个函数计算关系比较特殊,反推运算和自身相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值