今天总结一下交换两个数的方法,以前自己只会一种,最近在准备招聘会,分享一下自己的所获;
方法1:使用函数传址:
1 void swap(int *p1, int *p2) 2 { 3 int tmp; 4 5 tmp = *p1; 6 *p1 = *p2; 7 *p2 = tmp; 8 }
方法二:在C++中传引用
1 void swap(int &x, int &y) 2 { 3 int tmp ; 4 tmp = x; 5 x = y; 6 y = tmp; 7 }
方法三:不使用中间变量
void swap(int a, int b) { a = a+b; b = a-b; a = a-b; }
方法四:上述代码可能会产生溢出,改进为
void swap(int *p1, int *p2) { if(*p1 != *p2) { *p1 ^= *p2; *p2 ^= *p1; *p1 ^= *p2; } }
其中if判断是必须的,否则当有多个数或者两个数相等时会改变原来的值。
方法五:使用宏定义1
#define SWAP(a, b) {if((a) != (b)) {(a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b);}}
方法六:使用宏定义2
1 #define SWAP(a, b) {if((a) != (b)) {(a) ^= (b);(b) ^= (a);(a) ^= (b);}}
#define SWAP(a, b) do{if((a) != (b)) {(a) ^= (b);(b) ^= (a);(a) ^= (b);}}while(0)
do{......}while(0)用于封装语句序列并确保正确性。