#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);
}
【C学习】swap函数的多种实现对比
最新推荐文章于 2024-07-20 10:17:32 发布