今天我们来看一个简单的问题,大家对交换两个数字有多少想法呢,先看看这个。
以下我们全都以1,2,为例。
#include
void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
int main()
{
int a=1,b=2;
swap(a,b);
printf("a=%d b=%dn",a,b);
return 0;
}
请问这个代码会输出什么?很明显,这个函数并不能起到交换a,b的目的,主函数中的a,b的值并没有发生改变,我们要了解传值和传址的问题,所以它会这样。
a=1 b=2
--------------------------------
Process exited after 0.4186 seconds with return value 0
请按任意键继续. . .
那么该如何交换呢。
方法一:借助中间变量
#include
int main()
{
int a=1,b=2,t;
t=a;
a=b;
b=t;
printf("a=%d b=%dn",a,b);
return 0;
}
这种临时变量法是最简单和最常见的方法,它的使用领域非常广泛且常见。
方法二:函数
上面例子中的函数没有作用,那么该如何使用函数呢。
#include
void swap(int *a,服务器托管网int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int a=1,b=2;
swap(&a,&b);
printf("a=%d b=%dn",a,b);
return 0;
}
我们用变量地址,交换它们的地址即可以改变它们的值。
方法三:加减交换法
#include
int main()
{
int a=1,b=2;
a=a+b;
b=a-b;
a=a-b;
printf("a=%d b=%dn",a,b);
return 0;
}
这个方法处就是不需要中间变量,先使用a+b保存a的值,即b=a-b=a=b-b=a;达到交换的目的,缺点是a+b的结果可能越界。
方法四:乘除交换法
#include
int main ()
{
int a=1,b=2;
a=a*b;
b=a/b;
a=a/b;
printf("a=%d b=%dn",a,b);
return 0;
}
这里类似加减,只是了换成乘法和除法,但其缺点更明显,乘法越界的可能性更大。
方法五:异或交换法
#include
int main()
{
int a=1,b=2;
a=a^b;
b=a^b;
a=a^b;
printf("a=%d b=%dn",a,b);
return 0;
}
这里是二进制位运算的方法,异或的运算法则为相同为0,不同为1,利用异或可以轻松达到目的。
这种方法十分完美,没有越界问题等;建议掌握。
结果如下:
a=2 b=1
--------------------------------
Process exited after 0.4051 seconds with return value 0
请按任意键继续. . .
方法五:位移交换法
#include
int main()
{
int a=1,b=2;
a>16;
a=a&0xffff;
printf("a=%d b=%dn",a,b);
return 0;
}
这里比较难理解,建议自己实际用草稿操作一遍理解,可以直观的体会到方法的效果。
原理是把原来的int类型的a的值拆分成高16位和低16位,相当于多了16位的暂存空间可以周转,缺点是如果a或者b超过了16位,这种方法就会出错。所以实际不建议大家使用。
最后,我们可以将这些方法包装成函数使用,统称方法二的函数法。
好了,就讲到这里吧,希望通过上述文章让大家对交换两变量值有重新的认识,感谢各位的耐心阅读!
服务器托管,北京服务器托管,服务器托管网服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
写在前面 最近看到稀土掘金在搞2023年终总结征文活动,一直想尝试投稿试试,周末我就花了近一下午时间写完初稿,然后周一、周二完成精读再改稿,感觉OK,昨晚凌晨第一时间在稀土掘金投稿。 结果,又发生了同样的事情。 同样的文章,在博客园上、公号上阅读量很OK,在稀…