网络推荐



本广告位招租!

《C陷阱与缺陷》读书笔记,第二章

第二章 语法陷阱

2.1 理解函数声明
这一节我唯一想说的就是使用typedef。虽然typedef不能解决所有的声明问题,但显然可以大大简化对函数、变量声明的解读。如果你现在还在写:

CODE:

void (*signal(int, void(*)(int)))(int);而不是:

CODE:

typedef void (*HANDLER)(int);
HANDLER signal(int, HANDLER);
那你不光是给你自己,也是给所有将会阅读你代码的人找麻烦。

2.2 运算符的优先级问题
跟我在第一章的意见一样,除了显而易见的优先级(比如+-*/)之外,使用括号。虽然你的表达式看起来会显得繁琐一些,但理解起来肯定会容易更多。在工作中我也是这么用的,大概是因为人比较懒,没兴趣去记那些繁琐的优先级规律。

2.3 注意作为语句结束符号的分号
这一节似乎没什么好说的,我的建议是找一个好的代码编辑器吧,比如VIM、Emacs(PS:虽然我一向坚信“珍爱小拇指,远离Emacs”的条文,但我同样坚信总会有人喜爱Emacs)等等。Eclipse里面带的编辑器也不错。这些编辑器共同的特点是正确的缩进功能。如果你多写了一个分号或者少写了一个分号,代码会缩进到一个你预期之外的位置,给你直接的提示:你犯了错误。当然,这些工具也并不能解决所有的问题——至少,不能这样的假设。

2.4 switch语句
使用lint预防漏掉break的情况。

2.5 函数调用
好像没啥好说的。

2.6 悬挂else引发的问题
我的做法是不要写:

CODE:

if (...)
    foo();
else
    bar();
而是写成:

CODE:

if (...) {
    foo();
} else {
    bar();
}
总是使用括号。这样虽然会多写出来一行代码,但就算嵌套了很多层判断,悬挂else的问题都不会发生。我的另一个建议是使用带有正确自动缩进功能的代码编辑器,这样如果你犯了错误,编辑器会用一个错误的缩进提醒你。

第三章 语义陷阱

这一章大量的篇幅都在讲指针和数组。数组、指针以及指针和数组的关系是C最基本也是最重要的部分之一。只有正确掌握了这几个概念,才可以说入门了C语言。而且由这个几个概念延伸出去,可以联系到计算机科学里面最基本也是最重要的部分内容。这一章《C陷阱与缺陷》里的篇幅比较少,我建议参考《C专家编程》里相关的章节,并且结合操作系统原理中内存、进程相关的章节以及编译原理中连接器、载入器相关的章节加以理解,会对计算机系统的底层运作情况有一个清晰的认识。有人说C是一个简单的语言,其实大体就是这个意思。C下面没有封装更多的东西,直接就是操作系统和计算机硬件。你可以借这个机会,理论联系实际,把计算机科学的基本知识融会贯通起来,抽丝剥茧,发现其中最本质的东西,了解它们的联系和规律。这些是很难写在纸上,但却是知识中远比只需要记忆的那部分更重要的东西。
我也来说两句 查看全部回复

最新回复

  • 剑心通明 (2008-2-17 17:12:47)

    继续继续,翘首以待
  • 乱码 (2008-2-20 00:29:24)

    悬挂 else
    经常会碰到
    if()
    {
    ...
    }
    else if()
    {
    ...
    }

    然后就没有 else
    出错以后很难查到问题.....
  • isjfk (2008-2-25 13:46:57)

    悬挂else指的是:

    CODE:

    if (c1)
        if (c2)
            foo();
    else
        bar();
    这种情况。你以为else对应的是第一个if,但实际上这个else对应的是第二个if。

    你说的那个貌似不属于悬挂else的情况。当然再工整的语法都有被误用、滥用的可能,代码是否正确实现了业务逻辑要靠程序员的自觉,不能依赖语言的语法检查。
  • rocking2807 (2008-3-13 17:02:36)

    void (*signal(int, void(*)(int)))(int);

    返回值是是个返回值为空参数为整数的函数指针,参数为一个整形,另一个为返回值为空参数为整数的函数指针,的函数signal