测试环境:vs2013
代码如下
# include<stdio.h>
# include<stdlib.h>
int main()
{
int a = 1;
int b = 2;
int t = 0;
//法1
t = a;
a = b;
b = t;
printf("a=%d b=%d t=%d\n", a, b, t);
//输出结果 a=2 b=1 t=1
a = 1; //重新给a b t赋为原来的值
b = 2;
t = 0;
//法2
t = b;
b = a;
a = t;
printf("a=%d b=%d t=%d\n", a, b, t);
//输出结果 a=2 b=1 t=2
system("pause");
}
关于两个变量之间交换值的问题,我用了一个t变量来做交换变量的临时中转站,
发现无论是先把a 或b 放在中转站里面都不会影响最后的结果,影响的只是t的值,
法1和法2就只有这些差别吗?请问我说的对不对呢?
求吐槽!
程序一定要写的易懂,易读,最直观的方法不一定有最高的效率,但一定有良好的可维护性,这个很重要。因此请不要拘泥于具体的方法,用大家最喜闻乐见的就行了。你可能是初学者,我要告诉你的是,写程序就是写出自己的思想。
感觉就是一个方法,t只是个临时使用的变量,用完就丢的,它的值是什么并没有什么X用。
方法1和2就一个方法。
法1中t=a;表示把a的值赋值给t,这样就直接把t的值给抛弃了,,根据程序的步骤,到b=t,,就相当于把a的值赋值给b,同理a=b也是
法2只不过把a换成吧,把b换成a,原理都是一样的
没有区别,不能说是两种方法,只能说是1种方法的2种路径
两个过程是同一个方法,还有一种方法是不用中间变量t的,你在网上查找一下就要结果。
两人方法 不算是两算是一个,你可以这样
int main()
{
int a = 1,b = 2;
a=a+b;
b=a-b;
a=b-b;
printf("a=%d b=%d\n", a, b);
这样就省略t了
打错啦 才看到
int a=1,b=2;
a=a+b;
b=a-b;
a=a-b;
就这么点差别,没有什么。t没什么可关心的
方法1和2就一个方法。
额 变量交换一般是通过中间变量来作为中转站来实现交换,也就是你说的法1、法2;可以通过运算来实现:
a=a^b; b=a^b; a=a^b;如果你明白这里面的逻辑运算,可以用,不理解就是奇技淫巧,不论多么高明~
用临时变量做中转站,其实很好明白:想象有两个杯子(连个内存空间a,b),分别盛满两种液体(两个空间两种状态,两个数值1,2),现在要求你把两个杯子的液体交换~你怎么做?
准备第三个杯子(t),原则上你把杯子a或者杯子b的液体倒入第三个杯子(t)都可以,然后就可以完成两个杯子液体的交换~(最终的结果是留在第三个杯子t的液体是不一样的,一个是液体1,一个是液体2)
不过这里液体交换和数据是有不同的:把一个杯子的液体倒给另一个杯子,这个杯子就空了,但把一个空间的数值赋(传输)另一个空间,但这个空间的数值还在;把另一个杯子的液体到进应经盛有液体的杯子,会发生液体混合,而把另一个存储空间的数据赋值(传输)给已经有数据的空间,这个存储空间的数据会被新的数据完全覆盖(或者叫刷新)。
因为电子存储空间(比如寄存器、内存、硬盘)和杯子,虽然都是容器、存储的一个空间,但一个存储的是点位状态,一个是物质,两者是不一样的,这是由电子器件或者说晶体管的属性决定的~
其实这两个是同一种方法,这也是可移植和最易读的方法。网上有一种用异或实现的,不用临时变量,但是那种方法可移植性差,试想一下,如果是浮点数,异或这种方法就产生错误了。