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

#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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值