第一种方法:
可以将b的值加到a里面,得到的a的值就是a和b的和,再用a减去b,即用a,b的和减去b,再赋值给b,b的值就变成的原来a的值。最后用a减去b,即用a,b的和减去原来a的值,a的值就变成原来b的值。
如代码所示:
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("%d %d\n", a, b);
return 0;
}
但是这种方法有缺点,如果a,b数值太大,容易溢出int的范围,想要用一种不溢出的方法,就要用到按位异或的方法。
以3和5为例子,只写出二进制的三个位数,3和5分别为011,101。
如果3和3进行按位异或,011和011,位数相同为0,得到的结果为000。可以得知两个相同的数字按位异或,得到的结果为0.
如果3和0进行按位异或,011和000,位数相异为1,位数相同为0,得到的结果为011,可以得知一个数与0进行按位异或,得到这个数本身。
同时,按位异或支持分配律。
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d\n", a, b);
return 0;
}
第一次a = a ^ b得到a = 3 ^ 5。
第二次b = a ^ b得到b = 3 ^ 5 ^ 5。按照法则得b = 3 ^ 0,再得b = 3。
第三次a = a ^ b得到a = 3 ^ 5 ^ 3。按照法则得a = 5 ^ 0,再得a = 5。
即完成了a和b的交换。并且这种方法不会出现溢出的现象。