1. 通常我们的做法是创建一个临时变量。
a.
这种方法易于理解,也是初学者最易想到的方法
b.再进一步我们或许会用到函数,然而对于初学者来说会常犯这样的错误:
#include<stdio.h>
void Swap(int a, int b)
{
int tmp = 0;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("a = %d b = %d\n", a, b);
Swap(a, b);
printf("a = %d b = %d\n", a, b);
return 0;
}
这里需要注意:实参向形参的数据传递是“值传递”,,只能由实参传递给形参,而不能由形参传递给实参。
函数调用结束后,形参单元被释放。形参的值发生改变,不会改变主函数实参的值。
那么我们会用什么办法来避免这样的错误呢?
在这里利用指针,就很好的避免上述的错误
#include<stdio.h>
void Swap(int *pa, int *pb)
{
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("a = %d b = %d\n", a, b);
Swap(&a, &b);
printf("a = %d b = %d\n", a, b);
return 0;
}
2. 不创建临时变量的几种方法
a. 算术运算
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程: 第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;
第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;
第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
b. 位运算(利用异或运算)
异或运算的特点:通过异或运算能够使数据中的某些位翻转,其他位不变。
这就意味着任意一个数与任意一个给定值连续异或两次,值不变。
即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。
以上两种运算就很好的实现了不借助临时变量实现两个值得交换。