1.借助第3个变量
int a = 1,b = 2,c;
c = a; / * 保存 a */
a = b;
b = c;
2.不使用第3个变量
2.1 亦或方法
int a = 1,b = 2;
a = a ^ b;
b = a ^ b ; /* a ^ b ^ b == a */
a = a ^ b ; /* a ^ b ^ a == b */
2.2 加法方法
int a = 1,b =2;
a = a + b ; /* 有越界风险 */
b = a - b ; /* a + b -b == a */
a = a - b ; /* a + b -a == b */
2.3 乘法方法
int a = 1,b = 2;
a = a * b ; /* 有越界风险 */
b = a / b ; /* a * b / b == a */
a = a / b ; /* a * b / a == b */
不使用第3个变量的方法注意要点:
1.加法方法与乘法方法有越界风险,当两个互换的数很大时相加或者相乘导致溢出。
2.使用后三种方法时不可与自己交换。
针对2:同一个数与自己交换,隐式的自我互换。见下面的例子:
/* 亦或方法 */
void exchange0(int *a,int *b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
/* 加法方法 */
void exchange1(int *a,int *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
/* 乘法方法 */
void exchange2(int *a,int *b)
{
*a = *a * *b;
*b = *a / *b;
*a = *a / *b;
}
不使用第3个变量的两个数交换,一定杜绝自我互换,修复后的代码
/* 亦或方法 */
void exchange0(int *a,int *b)
{
if(*a == *b)
return;
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
/* 加法方法 */
void exchange1(int *a,int *b)
{
if(*a == *b)
return;
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
/* 乘法方法 */
void exchange2(int *a,int *b)
{
if(*a == *b)
return;
*a = *a * *b;
*b = *a / *b;
*a = *a / *b;
}
“`
总结:
两个数交换不使用其他变量推荐使用”亦或方法“,注意不可自己与自己交换。