dram.me

《C陷阱与缺陷》读书笔记(第2章)

2.1 理解函数声明

这一节主要讲到了如何定义函数指针。方法非常简单。比如函数原型为:

void sigfunc(int);

如果 sfp 是指向这个函数的指针,那么 *sfp 可以代替 sigfunc,所以下面这个式子与上式等同:

void (*sfp)(int);

再将 sftp 去掉,就可以得到指针类型:

void (*)(int);

还可以用 typedef 来定义类型,这样再此用到就方便了:

typedef void (*funcptr)();

2.2 运算符的优先级问题

看了这一节真是吓了一跳,很多非常不明显的优先级错误:

if(flags & FLAG != 0)
r = hi << 4 + low;

书上提到的方法是分类记忆:

非真实运算符 > 单目运算符 > 双目运算符

双目中:

算术 > 移位 > 关系 > 逻辑 > 条件 > 赋值

另外有一个挺有意思的例子:

a < b == c < d

看 a,b 和 c,d 的大小顺序是否一样。

2.3 注意作为语句结束标志的分号

有两个容易出错的地方:

2.4 switch 语句

这个倒是早就注意到的东西了。

2.5 函数调用

函数调用时必须带括号,如 f(),如果只是 f,则是返回函数地址。这和很多动态语言相似。

2.6 “悬挂” else 引发的问题

也是比较熟悉的一个陷阱。