C Traps and Pitfalls笔记

yayj 发表于 2005-10-23 20:33:22

  1. 如何解决if(a+b<0)的溢出问题?>本来不想用逻辑运算符的,结果没想出来,只有折个中了
    if (b == INT_MIN || a < -b)

  2. static是解决名字冲突的利器。
  3. 反复地检查边界条件,这是个好习惯。
  4. 为什么va_arg(ap, type)的type不能是char、short或float?

Koeing在讲这个宏时是直接使用type的长度来调整ap指针的,而栈是按4字节对齐的, 则char和 short类型的参数是转成int,float转成double来压入堆栈,所以当使用这几个类型时,va_arg调整ap指针时就会出错。但现在的 stdarg.h中可以使用__va_size(type)宏来计算对齐后的字节数,所以还是可以使用这些类型。不过gcc会对这个用法给出警告,并在 va_arg宏处设置一个int 指令,暂时还没想到gcc为什么会这么做。

关键词(Tag): c 人模狗样
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

你会为一把菜刀增加一个保护手指的装置吗

yayj 发表于 2005-10-23 16:16:40

我 们很容易想到办法让一个工具更安全,代价是原来简单的工具现在要变得复杂一些。食品加工机一般有连锁装置,保护使用者不让手指受伤。但是菜刀却不同,给这 样一个简单、灵活的工具附加这样的装置,只能让它失去简单灵活的特点。实际上,这样做的最后得到的也许更像一台食品加工机,而不是一把菜刀。

                                        ----------摘自 C Traps and Pitfalls

关键词(Tag): 借花献佛 人模狗样
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

"C程序设计语言"练习题解答(Updating...)

yayj 发表于 2005-10-22 20:32:12

第4章 函数与程序结构

  1. 编写函数strrindex(s, t),它返回字符串t在s中最右边出现的位置。如果s中不包含t,则返回-1。

    #include <string.h>

    int strrindex(char *s, char * t)

    {

    int i, j, k;

    int sl = strlen(s), tl = strlen(t);

    if (sl <>

    return -1;

    for (i = sl - 1; i >= tl - 1; --i) {

    for (j = i, k = tl - 1; k > 0 && s[j] == t[k]; --j, --k)

    ;

    if (k == 0 && s[j] == t[k])

    return i - tl + 1;

    }

    return -1;

    }


  2. 对atof函数进行扩充,使它可以处理形如123.45e-6的科学表示法,其中浮点数后面可能会紧跟一个e或者E以及一个指数(可能有正负号)。

    #include <ctype.h>

    double atof(char *s)

    {

    double val, power1, power2;

    int i, j, bsign, psign;

    for (i = 0; isspace(s[i]); ++i)

    ;

    bsign = (s[i] == '-') ? -1 : 1;

    if (s[i] == '+' || s[i] == '-')

    ++i;

    for (val = 0.0; isdigit(s[i]); ++i)

    val = 10.0 * val + (s[i] - '0');

    if (s[i] == '.')

    ++i;

    for (power1 = 1.0; isdigit(s[i]); ++i) {

    val = 10.0 * val + (s[i] - '0');

    power1 *= 10.0;

    }

    if (s[i] == 'e' || s[i] == 'E') {

    psign = (s[++i] == '-') ? 1 : 0;

    if (s[i] == '+' || s[i] == '-')

    ++i;

    for (j = 0, power2 = 1.0; j < (int)atof(s + i); ++j)

    power2 *= 10.0;

    if (psign)

    power1 *= power2;

    else

    power1 /= power2;

    }

    return bsign * val / power1;

    }

  3. 在有了基本框架后,对计算器程序进行扩充就比较简单了。在该程序中加入取模运算符,并注意考虑负数的情况。

    没做.....

  4. 在栈操作中添加几个命令,分别用于在不弹出元素的情况下打印栈顶元素;复制栈顶元素;交换栈顶两个元素的值。另外增加一个命令用于清空栈。

关键词(Tag): c 喃喃呓语 麻布袋
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

"C程序设计语言"读书笔记(Updating...)

yayj 发表于 2005-10-22 16:38:49

第4章 函数与程序结构

  1. fun()与fun(void)的区别

    若函数的声明为fun(),那么编译器将对fun关闭所有的参数检查,这种特殊处理是为了使新的编译器能编译比较老的C语言程序,实际中是应该避免的。

  2. 变量的初始化

    在不显式初始化的情况下,编译器将外部变量静态变量初始化为0,但不会初始化自动变量寄存器变量
    外部变量静态变量的初始化表达式必须是常量表达式,而自动变量寄存器变量的初始化表达式可以包含其它变量。

  3. 全局变量/函数与静态全局变量/函数的区别

    全局变量/函数对整个程序的各个部分都可见,而全局静态变量/函数仅在声明它的文件内可见,其它文件都无法访问。

关键词(Tag): c 人模狗样
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

thunderbird的bug

yayj 发表于 2005-10-16 20:56:33

thunderbird中Option->Connection Settings中的代理设置根本不起作用,
它始终是直接与pop服务器建立连接,不知怎么修改。

前几天重起了久违的thunderbird,发现开发小组已经修正了这个bug了。我现在用的版本是1.0.6中文版。
关键词(Tag): firefox 麻布袋
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

firefox的一些常用设置

yayj 发表于 2005-10-16 20:55:19

  • Google搜索控件的修改:
打开about:config页面,查找到browser.search.param.Google.1.custom和browser.search.param.Google.1.default两项,将它两个的值都设置为空

  • 始终在新标签中打开
打开about:config页面,查找到browser.link.open_newwindow选项,将值设为3
  • 比较有用的extensions:
FlashGot: 一个支持多个下载工具的管理器。
SwitchProxy: 管理代理的工具。
GooglePreview: 在Google的搜索页面中预览搜索结果。
ForecastFox: 提供天气预报的小工具,它的汉化版不错。
GmailNotifier: 顾名思义,建议Gmail的用户使用。
SessionSaver: 可以保存关闭Firefox前的所有tab。
Sage: RSS阅读器。
关键词(Tag): firefox 麻布袋
收藏: QQ书签 del.icio.us 订阅: Google 抓虾