#include<stdio.h>
#define SWAP2(a,b) \
{ \
a = a + b; \
b = a - b; \
a = a - b; \
}
#define SWAP3(a,b) \
{ \
a = a ^ b; \
b = a ^ b; \
a = a ^ b; \
}
void swap1(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void swap2(int* a,int* b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
void swap3(int *a,int *b)
{
*a^=*b;
*b^=*a;
*a^=*b;
}
int main()
{
int a = 1;
int b = 2;
printf("a=%d,b=%d\n",a,b);
SWAP1(a,b);
printf("a=%d,b=%d\n",a,b);
SWAP2(a,b);
printf("a=%d,b=%d\n",a,b);
SWAP3(a,b);
printf("a=%d,b=%d\n",a,b);
swap1(&a,&b);
printf("a=%d,b=%d\n",a,b);
swap2(&a,&b);
printf("a=%d,b=%d\n",a,b);
swap3(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
总结:SWAP1-3中“\”为连接符,在其后不能有空格或其它字符;用宏定义的方法使得数据交换比函数更有效率,swap1-3实质上是SWAP1-3的函数形式.
第一种很好理解,缺点是定义了第三个新变量
第二种优点是只使用了两个变量,缺点是a+b的值可能会超出Int范围,使计算结果错误
第三种方法不仅克服上以上的缺点,还使得程序运行最有效率。但其缺点也显而易见,只能用于整型数据的交换。
第三种方法的理解可以这样理解:任意的两个数a,b有a^(a^b)=(a^a)^b=b.