【C学习】swap函数的多种实现对比

来源:互联网 发布:windows开线程 编辑:程序博客网 时间:2024/05/13 04:50
#include <stdio.h>#include <stdlib.h>void Swap0( int a, int b);//交换函数void Swap1( int *a, int *b);void Swap2( int *a, int *b);void Swap3( int *a, int *b);void Swap4( int *a, int *b);void Swap5( int *a, int *b);int main(){    int a = 2,b = 3;    printf("交换之前:a:%d,b:%d\n",a,b);    Swap0(a,b);    printf("Swap0:a:%d,b:%d\n",a,b);    a = 2,b = 3;    printf("\n交换之前:a:%d,b:%d\n",a,b);    Swap1(&a,&b);    printf("Swap1:a:%d,b:%d\n",a,b);    a = 2,b = 3;    printf("\n交换之前:a:%d,b:%d\n",a,b);    Swap2(&a,&b);    printf("Swap2:a:%d,b:%d\n",a,b);    a = 2,b = 3;    printf("\n交换之前:a:%d,b:%d\n",a,b);    Swap3(&a,&b);    printf("Swap3:a:%d,b:%d\n",a,b);    a = 2,b = 3;    printf("\n交换之前:a:%d,b:%d\n",a,b);    Swap4(&a,&b);    printf("Swap4:a:%d,b:%d\n",a,b);    printf("\n交换之前:a:%d,b:%d\n",a,b);    Swap5(&a,&b);    printf("Swap5:a:%d,b:%d\n",a,b);    return 0;}/*不能交换,形参传值,实际传过去是拷贝的一份,没改变主函数中x,y是值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。*/void Swap0( int a, int b){int temp;temp = a;a = b;b = temp;    printf("Swap0内,交换后:a:%d,b:%d\n",a,b);}/*不能交换因为形参是指针,所以函数调用要传递变量的地址函数swap1(&a,&b),形参传递的是的a、b的地址,函数交换了地址。但是地址里存储什么内容没有变。对于main中的a,b值,a是所声明的地址命名,所以a的实际内容也没有变*/void Swap1( int *a, int *b){int *temp;temp = a;    a = b;    b = temp;    printf("Swap1内,交换后:a:%d,b:%d\n",*a,*b);}/*能交换地址指向的内容进行了交换*/void Swap2( int *a, int *b){int temp;temp = *a;    *a = *b;    *b = temp;    printf("Swap2内,交换后:a:%d,b:%d\n",*a,*b);}/*能交换用^是位异或运算,同为0或者同为1时,对应位结果为0;否则为1不使用多余空间最优算法。适合各种情况*/void Swap3( int *a, int *b){    if( *a != *b )    {        *a ^= *b;        *b ^= *a;        *a ^= *b;    }    printf("Swap3内,交换后:a:%d,b:%d\n",*a,*b);}/*能交换用+-运算不使用多余空间缺点:a、b同号时会溢出。改进:swap5、swap3*/void Swap4( int *a, int *b){    if( *a != *b )    {        *a += *b;//a=1,b=2;a+=b为a=3,b=2        *b = *a - *b;//b = a-b=1,a=3        *a -= *b;//a = a-b;    }    printf("Swap4内,交换后:a:%d,b:%d\n",*a,*b);}/*能交换用+-运算不使用多余空间缺点:a、b异号时会溢出。改进:swap4、swap3*/void Swap5( int *a, int *b){    if( *a != *b )    {        *a -= *b;//a=1,b=2;a-=b为a=-1,b=2        *b += *a;//b += a 为b=1,a=-1        *a = *b - *a;//a = b-a;    }    printf("Swap5内,交换后:a:%d,b:%d\n",*a,*b);}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信登录不上 钱怎么办 淘宝账号买家权限被限制怎么办 淘宝中店新品打不开怎么办 旺旺号被限制有退款怎么办 登陆微信收不到验证码怎么办 淘宝店注册成功后怎么办 充电宝掉进水里怎么办 空光盘读不出来怎么办 苹果8plus丢了怎么办 苹果8plus掉了怎么办 淘宝账户被限制使用怎么办 飞利浦电脑显示器黑屏怎么办打开 微信忘记密码手机号停用怎么办 淘宝账号登录密码忘记了怎么办 淘宝支付密码输错了怎么办 淘宝支付密码忘记了怎么办 淘宝货品上架后显示过期怎么办 被淘宝客监控了怎么办 助学贷款支付宝账号忘记怎么办 离婚支付宝的钱怎么办 扫码加载不出来怎么办 淘宝店铺被投诉售假怎么办 刚开的新店没人怎么办 淘宝访客量突然下降怎么办 支付宝账号封了怎么办 苹果x手机黑屏打不开怎么办 淘宝支付密码被锁定怎么办 淘宝支付密码锁定了怎么办 很抱歉手机淘宝停止运行怎么办 苹果手机桌面淘宝图标不见了怎么办 提示网页上有错误怎么办 淘宝定制家具违约两个月怎么办 同行在买家评价下面评论怎么办 淘宝知识产权侵权被投诉了怎么办 闲鱼买家说是假货退货怎么办 日验证失败次数上限怎么办 淘宝卖家发货不全怎么办 子账号登录不上怎么办 淘宝宝贝曝光量少怎么办 淘宝买东西退款卖家拒绝怎么办 华为手机淘宝不能收藏宝贝怎么办