MyMSDN

MyMSDN记录开发新知道

a Swap program

#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就溢出了,所以它存在一定的局限性。

posted on 2009-02-24 18:29 volnet 阅读(229) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


特殊功能