方法一:使用宏
#define Exchage(a, b) \
do{ \
a += b;\
b = a - b; \
a = a - b \
}while(0)
方法二:使用第三个变量
void inplace_swap(int *a, int *b)
{
int tmp;
tmp =*a;
*a = *b;
*b = tmp;
}
方法三:利用布尔环的属性,加法逆元。
void inplace_swap(int *x, int *y)
{
*y ^= *x;
*x ^= *y;
*y ^= *x;
}
方法四:利用整数运算的属性。
void inplace_swap(int *a, int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
第四种方法关于存在溢出的问题,补码加上形成一个阿尔贝群,以及表达式(x+y)-x求值得到y,无论加法是否溢出,而 (x+y)-y总是会求值得到x。