C语言中有关两个数,值的交换

一、开讲

   最近在系统的学习C语言,虽说以前在大学里学习过,但是人嘛,时间一久就会忘了。由于行业的原因,我学习了iOS,但是想学习iOS,C就是万万不能忘的。于是经过几天的时间,我终于有了一点小成就,就是有关在C里面的两个值的交换,这里或许只是一部分,希望还有知道方法的同事,不吝赐教。下面就不多说了,我们一起来看,怎么交换两个数的值,我这里面提供了三种方法。

第一种:第三方变量交换法

  我们在C++编译器中设三个变量,并且给其中两个变量赋值,第三方变量初始化为0,下面我们来看看具体的代码情况。由于第三方变量里面是空值,我们将a赋值给第三方变量,那么第三方变量中的值也就由0变成了7.这时a中的原值7就被内存清空了,此时在把b的值付给被清空的变量a,变量a中就又被从新赋值了,此时a中的值就变成了9。这时,由于第一步的时候,我们将a的原值赋给了第三方变量,此时我们在将存有a值的第三方变量中的值赋给第二步中被清空了的b变量。最后就得出a的值由原来的7换成了9,而b的值由原来的9换成了7。程序编译前后都不报错,所以结论成立。

#include <stdio.h>
int main(){
	int a = 7,b = 9;
	int temp = 0;
	printf("交换前: a = %d b = %d\n",a,b);
	temp = a;
	a = b;
	b = temp;
	printf("交换后: a = %d b = %d\n",a,b);
	return 0;

}

 

 第二种:位(^)运算法

     还是一样,我们在C++中定义两个变量,并且给他们赋值,然后打印出未交换前的结果从程序我们能看出a = a^b;b = a^b;a = a^b;这是代码的主要实现部分。“^”这是一个异或的符号,当然我也要告诉大家“^”有一个最重要的性质。就是一个数,同时异或两个数,结果还是他本身,所以根据这个特性,我们来看下代码的具体实现思路。

     首先,我们将代码a = a^b带入到b = a^b中就可以得到b = a;也就是将a的值赋值给了b;然后我们在看看第三步,就是将第二步b = a^b带入到第三个等式中可以得出a = b;同时,这里就实现了a和b值的互换,结论正确。

 

#include <stdio.h>
int main(){
	int a = 3,b = 5;
	printf("交换前:a = %d b = %d\n",a,b);
	a = a^b;
	b = a^b;
	a = a^b;
	printf("交换后:a = %d b = %d\n",a,b);
	return 0;
}

 第三种:加减运算法

   在这个办法开始讲解之前,我不知道大家知不知道两个杯子换水的方法?在这里,我要讲的就是这种方法。首先把代码粘过来。由代码,我们可以看出来,核心部分依旧还是中间的那段算法。我们暂时可以把b当做是一个大杯子,里面装了有大半杯水,然后把a当做一小部分水。我们来看,一大杯子水减去一小杯子水,是否可以得到”一中“杯子水,将减去a部分的水,剩下的部分水赋给a,然后一大杯水减去”一中“杯水是否等于一小杯水呢,这时本来放在a中的一小杯水就直接给到了b中了。然后结合第一步和第二步,他们之间得出的“一中”杯水加上一小杯水,那就得到了一大杯水了。这样就得出了,他们值的交换,可能我这说的还不是很容易懂,请见谅。下面我会给大家说,这种放法的不足之处。

#include <stdio.h>
int main(){
	int a = 3,b = 5;
	printf("交换前:a = %d b = %d\n",a,b);
	a = b-a;
	b = b-a;
	a = b+a;
	printf("交换后:a = %d b = %d\n",a,b);
	return 0;
}
  第三种方法的补充:

      我们也知道内存是有容量的,既然要用加减法交换两个数的值,那么我们就要考虑内存了。考虑如果a中装的水容量的问题,因为如果第一步中b中的水减去a中的水,把结果赋给a,a是否会装不下,而产生溢出的现象,如果是这样那么就会造成数据的丢失了,那么交换的值也就不能成功了。所以,这就是第三种方法的局限性,这里我不是很推荐大家用这种方法。我们做开发过程中还是比较喜欢用第一种放法,通熟易懂,好了我就讲这么多了,希望大家如果觉得说的不是很好,请多多指教,我一定虚心受教。

 

 

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值