#include "stdio.h"
#include "stdlib.h"
void foo(int *a, int *b) {
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
int main(void) {
int a = 1, b = 2, c = 3;
foo(&a, &b);
foo(&b, &c);
foo(&c, &a);
printf("%d, %d, %d", a, b, c);
return EXIT_SUCCESS;
}
foo看似缭乱却是一个交换函数:
从最后一次做*a和*b的位置开始向上:
也就是*b = *a - *b;扩展为*b = (*a + *b) - *b展开就是*b = *a;也就是将*a的值赋给了*b。(注意到在此之前*b从未改变过)
*a = *a - *b(这时候不能用上一行的结论,因为*a曾经改变过了)扩展为*a = (*a + *b) – *a 也就是*a = *b,这里*b是指原始的*b,而不是上一行的结论,至此就交换完毕。
可以注意到,这里并没有使用临时变量。所以这是一个不需要临时变量的交换方法。不过这种方法只支持支持operator+和operator-的数值计算(基本上只能用在整数上,因为对浮点的操作可能涉及到舍入的问题)
而且这个方法还有一个缺陷,就是对数值边界的判断,比入MAX_INT+MAX_INT就溢出了,所以它存在一定的局限性。