将两个数的数值进行交换。
<1>
//设置一个中间变量来存储一个数,再将另一个数赋给这个数
//将存储的数继而赋给上一个数。
//#include<stdio.h>
//int main()
//{
// int a = 1;
// int b = 2;
// int c = 0;
// printf("old: a = %d, b = %d\n",a,b);
// c = a;
// a = b;
// b = c;
//printf("old: a = %d, b = %d\n",a,b);
// return 0;
//}
<2>不引用中间变量的方法
//#include<stdio.h>
//int main()
//{
// int a = 1;
// int b = 2;
// printf("old: a = %d, b = %d\n",a,b);
// b = a + b; //将a,b 的和赋给b;
// a = b - a; //用a,b 的和减去a,得b的初始值,赋给a
// b = b - a; // 再用和减去数值变成b的初值的a,得到的是a 的初值,赋给b
// printf("old: a = %d, b = %d\n",a,b);
// return 0 ;
//}
众所周知int 类型占用4个字节,一个字节有8个比特位,
则一个int 类型数据可以储存32位二进制数;
所以当两个比较大的数据相加的和,很有可能会超出int 的存储范围,
造成数据溢出。
<3>改进
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 1;
int b = 2;
// 二进制数异或,同为0 ,异为1;
b = a ^ b;
// 此时b 的值已经赋给a
a = b ^ a;
// 此时a的值已经赋给b
b = a ^ b;
printf("a = %d, b = %d",a,b);
system("pause");
return 0 ;
}
若是采用异或运算符 ^ 则可以避免这个问题;
异或运算符是对于数据存储的二进制码进行改变;
(同为0,异为1)
若int 型数据a=10,b=20即:
a=0000 0000 0000 0000 0000 0000 0000 1010
b=0000 0000 0000 0000 0000 0000 0001 0100
通过异或运算b=a^b得
b=0000 0000 0000 0000 0000 0000 0001 1110
a=a^b得
a=0000 0000 0000 0000 0000 0000 0001 0100
此时已经将原来b=20的二进制数换到a上
b=a^b得
b=000 0000 0000 0000 0000 0000 0000 1010
这时完成a,b 的二进制码交换,即a,b的数值进行了交换。
由于只进行异或运算不会增加原有数值的二进制位数,
这样也就不会造成数据溢出的问题,并且加快了程序
运行速度,提高了效率。