花了一天的时间,读完了两本国产C/C++书(《C指针编程之道》、《我的第一本C++书》),随即写下印象与评价
用“指针”名头包装着的N本大学计算机教材合辑
——《C指针编程之道》(孔浩 张华杰 陈猛 人民邮电出版社)印象与评价
花了一个下午,还算是比较仔细地读完了本书,随即写下大概的印象与不全面的评价如下。如有错谬之处,期待各位大虾指正,免得误人子弟。
光看书名,实在很震慑人心!指针!道!这是一本关于C的灵魂的灵魂的书呀!接着看封面,一个ASCII Art的墨镜男Geek头像,范儿黑客帝国呀!太酷了!再看封底,“爱数组,爱结构体。爱琢磨算法,爱玩弄内存,更爱掰着手指数字节。爱自己冥思苦想,也爱与众生分享。……”—— 绝对是Geek + Hacker + Open Source呀!真是心有戚戚焉!
好了,最后咱们翻开书页看内容吧……
最初的印象,全书编排紧凑却又有些狭促:扉页前没有空白装帧页;序、跋、参考文献、附录、索引、后记、编后等辅文一概都没有;正文第394页就紧粘着封底;每章首页隐去了页眉与页脚但无留白,全书唯一的留白处仅仅是在各章的尾页。
其次,全书的代码块部分,皆使用g字不打圈&字不开口的Sans字体(或类似字体)呈现,有别于最常见的Courier/New字体,看着也还是挺养眼的。不过非代码块(行文/解说)中的代码字体却是非等宽字体,跟谭老教授畅销书一类的一样,算是粗陋了。
接下来,翻翻目录,首先发现有《4.2 不能不说的秘密——main函数的秘密》,以为是重大亮点,立即翻至第69页拜读。结果令我跌碎眼镜。第69页最后一行开始解说如下:
“C语言规定,main函数定义形式为:
void main(……){……}”
—— 这是最让我反感的C编程观念之一,但这里作者却断言是“C语言规定”。在《4.2.2野百合也有春天》中,作者用了不到一页纸的篇幅,非常粗略和狭隘地解说了main函数的参数与操作系统的关系。整个4.2让我觉得,这一节写了还不如不写。
要说本书作者(们)抱定“void main(……)”的“规定”,那也不是。前五章的代码示例还全都是用“int main(void)”的。(而以后各章节却是错误地使用void main(……)。)
再翻到第56页,在那里却又是这样说的:
“在最新的C99标准中,只有两种定义方式是正确的:
int main(void)
int main(int argc, char *argv[])”
由此看来,整本书所体现的关于C的标准或“规定”,没有统一性。这可能跟整本书分由三位作者撰写以及编辑不在乎ANSI/ISO标准有关吧。莫非……本书真是在言说一个“绝圣弃‘标’,民利百倍;绝仁弃‘准’,民复孝慈”之“道”?
进一步仔细阅读全书各章……
读完前4章,感觉是谭老教授畅销的C教材中“指针”部分的一个“详化版”。
读到第5章,感觉跟国内大学传统的《数据结构(用C描述)》教材线索与风格基本一致,并无太多新意。本章可以作为上述教材的“超缩略版”。
而第6章,也是谭老教授C教材中“I/O”部分的一个“详化版”。
第7、8两章,跟第5章一样,同属大学《数据结构(用C描述)》(包含了算法的)教材的“缩略版”。
第9章,是大学《计算机组成原理》教材中“汇编语言”部分的“蜻蜓点水版”。
读到第10章《Linux C 编程技术简介》一开始,才觉得略有新意。见到GNU的gdb登场,算是有一点点Hacker**乍现,但毕竟也只是“现”一簇昙花而已。进入本章的第2、3节,就是大学《操作系统》教材的一个“超缩略版”。而本章的第4节,则是大学《计算机网络原理》教材的一个“Baby级入门版”。
第11章,也属于大学《操作系统》教材的一个“超缩略版”。
第12、13章,类似于市面上的那种号称“精彩应用”、“开发实战(例)”等等之类的教程。
纵观全书,分明就是国内大学计算机专业里N门传统基础课程教材的杂凑合辑,“道”(盗)了谭老教授、严老教授、汤老教授等等的教学思路之一贯,所谓“一贯道”。
所以,我认为,在本书《前言》部分,编者宣称:
“本书适合以下读者阅读:
C语言开发初\中级爱好者
C语言开发专业人员
高等院校的学生”
—— 其中所列3类人当中,有2.5类纯属滥竽充数。本书对于当代C语言中级爱好者来说,已经完全不够用或早已过时(比如说,里面大量的实例是基于Turbo C和MS DOS的),更遑论对于“C语言开发专业人员”。而高等院校的学生则根本不需要本书,因为只要他们通过了专业科目的考试,所有的教材,以及基本上作为这些教材缩略版的本书,就真的可以统统扔掉了,本书的价值甚至可能还不如他们的课堂笔记和“考前预测题”试卷。
严格地说,本书的读者群应该这样定位:对C有比较强烈兴趣但却没有接受过系统的计算机专业教育和训练的人。
在本书中,还存在一些专业性错谬。比如:
(i)在第9页的例子(1)中,对于“int num[70];”这个“定义”,解说是“该数组可以存放71个int类型的数据”。这是一个典型的,有如著名的《C陷阱与缺陷》中所提到的“差一错误(Off-by-One Error)”。但是,本书中的这个错误又不是那么的“典型” —— “差一错误”应该是“很隐蔽”或“较难觉察”的,但是这里的这个错误,却也太明目张胆了呀!
(ii)从第13页开始讲解字符串,下面始终把字符串末尾的结束符写成“\o(小写拉丁字母O)” —— 这让人感觉好像有那么一点在数学里空集符号 Ø与希腊字母φ、Φ、Ψ、ψ混淆乱用的意思 —— 这之所以是一个比较严重的专业性错误,是因为在C当中,“\o”有着完全独立和迥异的意义。
(iii)在第234页,把gcc命令参数-o后面所要标识的文件,以及a.out这类文件,都明确地称为“目标文件”。这又是一个严重的专业性错误。对于那些本来就对编译、链接等概念含混不清的学生来说,这种误导简直就是不能原谅的。
除此之外,还有一些“笔误”。比如在第114页,有一处写成“文本(test)文件”。
当然,本书还是有一些值得称道的优点:
(i)穿插在全书中的“知识提示”楷体字部分,不失为亮点之一。
(ii)本书对于代码实例的讲解很细致,不大而化之,尤其是在前5章里面;且注重代码中的注释。
(iii)全书有大量的代码实例,均尚未发现其中有语法错误和逻辑错误 —— 这应该跟有多达23位专业人员“参与了资料整理和代码编写”有关。
最后,还是向本书作者孔浩、张华杰、陈猛三位先生,以及那个多达23人的”资料整理和代码编写”团队,致以敬意和感谢! |