不创建临时变量交换两个数的值
我们都应该知道,要交换两个数的值,只需要创建一个临时变量,就可以进行交换。这种方法是简单的,也可以较为轻松的理解明白。代码如下:
#define _CRT_SELECT_NO_WARINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m = 7;
int n = 5;
int p;
p = m;
m = n;
n = p;
printf("%d\n",m);
printf("%d\n",n);
system("pause");
return 0;
}
这样输出得到的结构就是5和7了,但是,你是否清楚还有不创建第三种变量进行数值的交换呢。
第一种:加减的方法
代码如下:
#define _CRT_SELECT_NO_WARINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a, b;
a = 5;
b = 7;
a = a + b;
b = a - b;
a = a - b;
printf("%d %d", a, b);
system("pause");
return 0;
}
这里你是否看明白了呢?
在这部分代码中,你可以看到,把a+b的值赋给了a,这样a的值的大小现在为a+b;然后,再把a-b的值赋给b,这样b就是原来的a的值了,这里你是否看懂了呢?b=a-b这个表达式中的a,现在的值得大小是a+b,a是原来一开始的a的值,这样你就明白了吧;再然后,现在b的大小是原来的a,而a的大小依旧是原来的a加上原来的b,那么,这个时候a=a-b中a-b就表示原来的a加上b减去b所代表的a的大小,剩下的就是原来的b的大小,这样你是否明白了呢?
此外,在这里用乘除的方法和加减是差不多的,只不过这两种方法都是有局限性的。
局限性:
加减中,如果数字的太大,这样会造成溢出的状况,即a和b的取值是局限的。
乘除中,如果再除数位上的数字为0.这样,程序显然也是走不下去的。
第二种:异或的方法
代码如下:
#define _CRT_SELECT_NO_WARINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a, b;
a = 5;
b = 7;
a = a^b;
b = a^b;
a = a^b;
printf("%d %d", a, b);
system("pause");
return 0;
}
在这里,异或的理解和上面加减的理解方式是差不多的。吧a^b的值赋给a,这样b=a^b中就相当于原来的a^b^b,这样a的值就赋给了b;
同样的道理,在下一步中a=a^b就相当于原来的a^b^a,这样b的值就赋给了a;这样也能达到数值的交换,并且没有过多的局限性。
但是,平时我们并不会经常选择下面两种,主要是因为程序编译时比较繁琐,并没有创建变量来的快捷和方便。