理解这本书之前别用C语言做软件
这是一本需要放在案头时时翻阅的书,甚至如果不显得过分的话,每次写C代码之前都应该翻阅一下目录,回忆一下大致的内容。
这本书从词法、语法、语义、链接(中文版译为“连接”,但据我所读过的相关书籍,全部译的是“链接”)、库、预处理器、可移植性等层次和方面介绍了C语言编程中可能遇到的问题。
其中涉及到一些ANSI C之前的内容,这对于一些读者(包括我)可能来说是比较陌生的,如果有志于维护使用K&R C编写的古董程序或者想写出几乎所有C编译器都能搞定的代码的,可以细细琢磨琢磨,其他人亦可以借此训练训练思维,或者说测试测试自己的功底。
这本书里还有一些部分非常底层,会涉及到大端法、小端法的问题,也会涉及到数据的位模式的问题。这个是需要一定的基础的,我这方面的知识应该是来源于CSAPP(不好意思,不算植入广告吧)的。
对于其中记录的缺陷和陷阱,切不可走马观花。我觉得读书、尤其是这类总结了前人犯过的错误和经验的书籍,必须有三问:一问原来为何出错,二问解决办法为何正确,三问如何避免出错。一般的书籍都解释了原来为何出错,那么读者就应该想想如何才能发现这类错误。
关于思考如何避免出错,我举两个例子:
一个是此书2.6节讲到了“悬挂”else引发的种种问题,如果大家写的代码足够多并且以多写一对花括号为耻的话,肯定已经遇到了这个问题。如果其中涉及到宏,则问题隐藏得会更深。那么如何避免出错呢?首先,前面提到宏会使问题得到隐藏,那么”小心、谨慎“这种说法是绝对行不通的,甚至使用一些自动indent的工具也不能发现问题。那么我们就应该想其他的办法。而我能想到的就是所有的if从句和else从句都用花括号包围起来。这当然得先树立正确的荣辱观,即不以多写了“没必要”的花括号为耻。
二是练习1-2中隐含的一个问题:既然编译器不支持嵌套注释,那如果我在注释代码的时候,这段代码中有注释呢?难道编译器报错之后我就把代码段中的注释去掉?那我如果只是临时注释掉以供调试或其他用途,不久还会使用呢?根据《代码大全》第二版(这个也不是广告),我们可以利用预处理器来解决这个问题:
#if 0
/* statements to comment out */
#endif
以上便是我的一点读书感受和方法论。
这本书从词法、语法、语义、链接(中文版译为“连接”,但据我所读过的相关书籍,全部译的是“链接”)、库、预处理器、可移植性等层次和方面介绍了C语言编程中可能遇到的问题。
其中涉及到一些ANSI C之前的内容,这对于一些读者(包括我)可能来说是比较陌生的,如果有志于维护使用K&R C编写的古董程序或者想写出几乎所有C编译器都能搞定的代码的,可以细细琢磨琢磨,其他人亦可以借此训练训练思维,或者说测试测试自己的功底。
这本书里还有一些部分非常底层,会涉及到大端法、小端法的问题,也会涉及到数据的位模式的问题。这个是需要一定的基础的,我这方面的知识应该是来源于CSAPP(不好意思,不算植入广告吧)的。
对于其中记录的缺陷和陷阱,切不可走马观花。我觉得读书、尤其是这类总结了前人犯过的错误和经验的书籍,必须有三问:一问原来为何出错,二问解决办法为何正确,三问如何避免出错。一般的书籍都解释了原来为何出错,那么读者就应该想想如何才能发现这类错误。
关于思考如何避免出错,我举两个例子:
一个是此书2.6节讲到了“悬挂”else引发的种种问题,如果大家写的代码足够多并且以多写一对花括号为耻的话,肯定已经遇到了这个问题。如果其中涉及到宏,则问题隐藏得会更深。那么如何避免出错呢?首先,前面提到宏会使问题得到隐藏,那么”小心、谨慎“这种说法是绝对行不通的,甚至使用一些自动indent的工具也不能发现问题。那么我们就应该想其他的办法。而我能想到的就是所有的if从句和else从句都用花括号包围起来。这当然得先树立正确的荣辱观,即不以多写了“没必要”的花括号为耻。
二是练习1-2中隐含的一个问题:既然编译器不支持嵌套注释,那如果我在注释代码的时候,这段代码中有注释呢?难道编译器报错之后我就把代码段中的注释去掉?那我如果只是临时注释掉以供调试或其他用途,不久还会使用呢?根据《代码大全》第二版(这个也不是广告),我们可以利用预处理器来解决这个问题:
#if 0
/* statements to comment out */
#endif
以上便是我的一点读书感受和方法论。
有关键情节透露