标签:
最近在系统的学习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是否会装不下,而产生溢出的现象,如果是这样那么就会造成数据的丢失了,那么交换的值也就不能成功了。所以,这就是第三种方法的局限性,这里我不是很推荐大家用这种方法。我们做开发过程中还是比较喜欢用第一种放法,通熟易懂,好了我就讲这么多了,希望大家如果觉得说的不是很好,请多多指教,我一定虚心受教。
标签:
原文地址:http://www.cnblogs.com/yuluoluoluo/p/5008988.html