教你轻松理解:C语言中的三种数字交换方法,最后一种很少见
(一)前言
你知道有多少种实现两个数字交换的方法吗?本文将介绍三种方法,一个比一个精彩。
(二)解法一
分析:现在我们有两个杯子,分别装满了可乐和牛奶,如图:
我们如何将两个杯子中的大小互换呢?很简单,再找一个空杯子不就行了吗!如图:
我们分三个步骤进行:
- 将可乐杯中可乐倒入空杯子
- 将牛奶杯中的牛奶倒入可乐杯
- 再将”空杯子“的可乐倒入牛奶杯
如图:
了解了解法一的思想之后呢,代码实现是轻而易举了。
int main()
{
int a = 10;
int b = 20;
int temp = 0;
temp = a;
a = b;
b = temp;
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
运行结果如下:
反思:如果找不到所谓的”空杯子“,我们能不能不借助其他变量,而完成交换呢? 实际上,这也是某公司的一道面试题,让我们来探究一下把!
(三)解法二
分析:我们这次用一个红球,一个绿球来分别代表两个杯子里的东西,如图:
上面这幅图,完整的演示了如何交换的过程,或许刚接触的小伙伴们还没有反应过来,但请再仔细琢磨 一会,如果还是有些想不通的地方,可以留言评论哦,作者会耐心解答~ 既然搞清楚了原理,那么代码的实现就简单了,请看:
int main()
{
int a = 10;
int b = 20;
a = a + b;
b = a - b;
a = a - b;
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
我们注意到,解法二是有bug的,由于整型int空间有限,如果a和b的值很大,a+b的值很可能超出了整型int的范围,这样会出现错误的结果,如下图:
那么有没有更完美的方法呢? 当然! 前方高能!!!
(四)解法三
解法三比较抽象,我们直接先放代码:
int main()
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
解析:我们先来了解一下3个位操作符:&,|,^. 它们操作的对象是二进制位,&表示二进制位中有一个为0,结果为0
|表示二进制位中有一个为1,结果为1
^表示二进制位中相异结果为1,相同结果为0
我们重点来关注一下^:
好了,今天的分享到此结束,感谢小伙伴们的阅读,欢迎大家积极评论哦~
转载自:https://juejin.cn/post/7369951085195903039