| a | b | c | d | e |
+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+
| a | b | c | d | e |
+---+---+---+---+---+
| 2 | 3 | 4 | 5 | 1 |
+---+---+---+---+---+
int &swap(int &a, int &b)
{
b = b ^ a;
a = a ^ b;
b = b ^ a;
return b;
}
然后可以把代码优化为:
int &swap(int &a, int &b)
{
b ^= a;
a ^= b;
b ^= a;
return b;
}
继续优化,把三句压缩为一句,如下:
int &swap(int &a, int &b)
{
b ^= a ^= b ^= a;
return b;
}
还可再优化,如下:
int &swap(int &a, int &b)
{
return (b ^= a ^= b ^= a);
}
现在来顺次交换5个变量的值,如下:
swap(a, b); //返回b
swap(b, c); //返回c
swap(c, d); //返回d
swap(d, e);
既然有返回值,那么可以写成链式的,如下:
swap(a, b); //返回b
swap(swap(a, b), c); //返回c
swap(swap(swap(a, b), c), d); //返回d
swap(swap(swap(swap(a, b), c), d), e);
现在,让我们来把swap函数依次用相应的函数体替换掉,如下:
e ^= d ^= e ^= swap(swap(swap(a, b), c), d);
e ^= d ^= e ^= d ^= c ^= d ^= swap(swap(a, b), c);
e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^= swap(a, b);
e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^= b ^= a ^= b ^= a;
好了,最后一个语句就实现了顺次交换五个变量的值,写程序验证如下:
#include <stdio.h>
#define PRINT(A) do {/
printf("%d/n", A);/
} while (0)
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
// b ^= a ^= b ^= a; // swap(a, b)
// c ^= b ^= c ^= b; // swap(b, c)
// d ^= c ^= d ^= c; // swap(c, d)
// e ^= d ^= e ^= d; // swap(d, e)
e ^= d ^= e ^= d ^= c ^= d ^= c ^= b ^= c ^= b ^= a ^= b ^= a;
PRINT(a);
PRINT(b);
PRINT(c);
PRINT(d);
PRINT(e);
return 0;
}
运行结果如下:
2 3 4 5 1
测试结果正确,达到预定目标。
知道了五个变量的顺次交换,那么任意多个变量的顺次交换就可以依次推导出来,在此就不多写了。
当然,除了本文介绍的方法外,还有其它方法可以实现不用临时变量交换任意多个变量的值,读者可以自己探索一下。