#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看似繚亂卻是一個(gè)交換函數(shù):
從最后一次做*a和*b的位置開始向上:
也就是*b = *a - *b;擴(kuò)展為*b = (*a + *b) - *b展開就是*b = *a;也就是將*a的值賦給了*b。(注意到在此之前*b從未改變過(guò))
*a = *a - *b(這時(shí)候不能用上一行的結(jié)論,因?yàn)?a曾經(jīng)改變過(guò)了)擴(kuò)展為*a = (*a + *b) – *a 也就是*a = *b,這里*b是指原始的*b,而不是上一行的結(jié)論,至此就交換完畢。
可以注意到,這里并沒有使用臨時(shí)變量。所以這是一個(gè)不需要臨時(shí)變量的交換方法。不過(guò)這種方法只支持支持operator+和operator-的數(shù)值計(jì)算(基本上只能用在整數(shù)上,因?yàn)閷?duì)浮點(diǎn)的操作可能涉及到舍入的問題)
而且這個(gè)方法還有一個(gè)缺陷,就是對(duì)數(shù)值邊界的判斷,比入MAX_INT+MAX_INT就溢出了,所以它存在一定的局限性。