学C,通常看上一两本入门书足矣(水货如我,就看过一本谭浩强),而书之好坏无所谓,怎么都能把你整入门了,而你一入门,便不太可能再去读一本更好的入门经典。于是我产生了把主流、经典的C入门书籍都撸一遍的念头,比比看,到底哪(些)本最适合入门——专业蛋疼,请勿模仿——一来弥补自己错过的好书(学习机会),二来供准备学C的朋友参考(少走弯路)。
不管你学什么,入门书就如启蒙老师一样重要,老师不好,你对所学内容都会产生排斥心理,启蒙好了,这门手艺甚至可能成为你的看家本领。C语言规模并不庞大,但所含知识点比较杂乱,所有教材都这么些内容,就看编者以什么顺序、什么主次、什么表达方式讲述。私以为一本好的入门书应具备以下两个特点:一是亲和易读,如同一个故事娓娓道来,你翻开的是一个多彩的世界,而不是一本僵硬的字典;二是分量足够,看完它你就真正入门了,有些书大白话噼里啪啦扯了半天乍感觉挺有意思其实没啥内容,当你真正着手使用时才发现还得再看本别的。国内良莠不齐的C教程数不胜数,同名如“C程序设计”“C语言程序设计”“C语言程序设计教程”的都多如牛毛,这些不知名的就不予考虑了,要看就看经典。
→ 如果你是零基础
《明解C语言》(337页)推荐指数:★★★★★
乍一看还以为是本新书,但原版在1999年就发行了,引进得实在太晚。属于比较严肃的教材,忠诚于专业术语,并未考虑更通俗的表达方式,并涉及一些算法,适合正儿八经地学C;内容组织很成功(把排序放在结构体部分的做法很神奇),循序渐进,知识点比较浅,并不全面,相对偏僻及细枝末节的内容没有讲述(也不必要拿来让初学者头大),没有冗余,应该静下心来一字一句地看,一丁点也不容错过。PS:把C历史背景放在附录不失为聪明的做法,毕竟比起发展史什么的,读者可能更关心如何立马写个hello world。
《21天学通C语言》(614页)推荐指数:★★★★★
槽点一:这书名也忒俗了吧,这类书一般不都是水货吗?
解释:确实拥有这类书名总是要为人所诟病,但你千万不该因此而错过此书。这是本来自国外的教程,原名还就是“Sams Teach Yourself C in 21 Days”,然其质量是国内那些名字类似的书所难以相比的。
槽点二:614页,也忒厚了吧!完全是学霸级初学者专用啊。
解释:C语言的21天课程其实只占了前431页,后面是C++、Java、C#等附加课程,不在本次自虐活动范围之内,故我也没有看。
本书把C的每一部分都讲解得特别细致,附有例子、经验、注意点、建议等,还详细地介绍了各种你脑中可能会产生的疑问或在实践中可能会遇到的问题。有些教材或多或少显性或隐性地要求读者能够举一反三,而此书不仅介绍了“一”,把“三”也逐一讲解了(比如各知识点的组合运用)。没有死循知识结构安排内容,而是按照读者慢慢适应的学习过程循序渐进。为确保读者理解清楚,提前使用时简要介绍过的知识点会在后续章节重新详解。
然而跑上来给的例子并不简单,一股脑儿介绍不少东西,零基础者看着可能会有点头大。还存在一些不严谨的地方,虽谈不上误导,但可能会引起困惑。除去这些瑕疵,我终究是被它惊艳到了,力荐之。PS:我看的这2012年8月第一次印刷的版本有不少印刷错误,希望后续印版会有校正。
《C Primer Plus》(626页)推荐指数:★★★★★
怎么说呢,看得出这样的作者才是真正懂C、爱C的人,对各个版本的C标准了如指掌。好比写文章,没有才华的人生搬硬套才把事情讲清楚,而浑身才气的人稍微抖一抖,文字就散落成一篇佳作。第一章概览就把我赤裸裸地惊艳到了,同样介绍C的历史及背景,却不是其他书那样死板的陈列,语言精炼意赅,不需讲的果断不讲,需要讲的一语中的,没有废话,一气呵成。恨自己当初学C看的不是这本。
跑上来一股脑介绍的东西很多,很细,初学者可能见了头大,但你若能耐下性子细细看懂,必会感叹它讲得真棒。行文极其精致、严谨,即使初学者可能体会不到这一点;内容详尽、细致,无愧于书的厚度,常用的不常用的,基础应用高级应用,大庭广众下的犄角旮旯里的应有尽有;全方位多层次实用技巧、注意事项,示例经典,醍醐灌顶,兼具入门书与工具书的气质。
总体上云巅工作室译得还算不错,但你依然会遇到一些拗口的句子,然而毕竟瑕不掩瑜,书的总体质量摆在那里,看引进第六版时能不能译得更好些。
《啊哈C!思考快你一步》(191页)推荐指数:★★★★☆
这是唯一一本实体书和电子版我都没能接触到的,或许是不够热门,网上找不到完整的pdf,连出版前的草稿版《啊哈C语言》也仅公开了一半。若是有朋友能搞到完整的电子版,恳请予我共享一份。我这里看的便是只有一半内容的先行版(以及正式版的几十页试读样章),还带着新鲜的错别字和病句,但版面接近正式版,读起来也是比较舒适的。
不知道啊哈磊(作者)这哥们是何方神圣,也仅是个有想法的普通人吧,书上是这么介绍的:“曾在中科院玩过单片机。武汉大学历史上第一位以本科生身份加入MSRA的小伙伴,在机器学习组从事搜索引擎方面的研究。发表国际会议论文一篇(IEEE)。全国青少年信息学奥林匹克金牌教练。”我很喜欢这样年轻一代人写的书,用语随意,带着颜表情,博文style,没有套话,没有代沟,看着很亲近。本书号称是“小学生坐在马桶上都可以读懂的‘C语言编程’入门书”,你可能不信,大学生都喊着学C枯燥,小学生那点基础和智商就甭提了,可本书还真够小学生看懂,我甚至觉得有些地方还能写得更萌、更形象些。不过小学生能接受的程度毕竟是有限的,本书定位是如此的低,以至于只介绍了C最浅的那部分知识,更多篇幅用来举例、增加读者的编程兴趣,简直太适合零基础入门了!而啊哈磊自己基于gcc做的啊哈C编译器也非常适合初学者练习编程,就像他自己说的,是简洁得不能再简洁的C语言编程软件,没有工程的概念、没有编译链接的步骤、没有环境配置,各种没有,你一打开连代码框架都已经写好了,是专为初学者制作的良心产品。
《C程序设计》(第三版378页、第四版390页)推荐指数:★★☆☆☆
把“发行逾1100万册”的消息印在封面大中央的做法实在太中二了,你就是本指定教材又不是畅销书,全国高校都用你不破千万才怪呢!并且,千万的销量同时也意味着接受千万读者的检验,稍欠严谨即易被喷。网上有个500多页的word文档(百度“《C程序设计》错误”即可找到),简直太蛋疼了,他写得完别人也看不完啊!本书确实不够严谨+印刷问题层出+许多地方还存在严重错误,但这份文档有点吹毛求疵,其中不少说法令人难以苟同,500多页的规模水分太大。
这本教材,初学者拿来学编程确实较易理解,但对C语言的把握会有一定偏差,慎读。而我们不妨暂且忽略其中的一些重大问题,重新审视之。作为国内教材中的典范,此书虽然在内容组织上依然中规中矩,但知识点讲解十分通俗,由于通俗,稍显(我是说稍显)啰嗦。做教材可以,不适合自学,因为你不能确定哪些是次要的。毕竟作为一本国家级教材,该涵括的都得涵括,不仅要领人进门,还得保证读者达到能考试的程度;摆脱不了应试教育的特点,为了巩固知识点,时不时会冒出(i++)+(i++)+(i++)和a+=a-=a*=a这样神奇的式子。如果你喜欢这种style,千万不要错过此书,没错,我当年就有点喜欢这种style,乃觉这书不错的原因之一——竟然让我搞懂了这么复杂混乱的玩意(后来才发现实际编程中根本没人这么做)!
→ 如已学过一丢丢
《C程序设计语言》(258页)推荐指数:★★★★★
昵称K&R(两位作者姓氏首字母),C语言之父的作品,就好比向别人介绍自己的孩子,不能再精辟,不能再权威,被奉为C语言圣经。在C还没有统一标准的年代,78年K&R的第一版直接被广泛接受为C标准,其他号称是圣经的C语言书用词未免也太想当然了……
圣经就好比一件标准模板,国内外数不清的C教程都是参照K&R写的,一如大堆的浏览器都使用了IE内核一样。B5的开本短短258页,除去供查阅的附录仅166页,再除去第8章“Unix系统接口”仅剩148页,这么少的篇幅将C语言讲得清清楚楚,简直是场华丽的艺术!
此书写得非常严谨,必要之处还提及老版C的情况,可以说学C必看,但并不适合零基础入门,正如其第1版序中所言:“本书并不是一本有关程序设计的入门性手册,它要求读者熟悉基本的程序设计概念,如变量、赋值语句、循环和函数等。”从头至尾使用的均是书面化的术语,并涉及到逆波兰、二叉树、Unix等专业知识,还时常将C与Fortran、Pascal语言进行比较,你若不了解这些看着一定头痛,因此K&R并不是入门的最佳选择。
《C语言入门经典》(第4版571页、第5版584页)推荐指数:★★★☆☆
一看这霸气的书名就知道它是部经典,当然这是译名,(第4版)原名为“Beginning C: From Novice to Professional”,表达多中肯,没错,form的是novice,首先你得是个novice,前言中果断暗示你最好此前接触过编程这玩意儿。内容是一整块一整块讲的,力争全面、深入,没有轻重缓急,讲完讲透为止,必要时毫不客气地使用后面才细讲的技术,导致一下子有过量知识点展现在读者面前。多数章尾有个程序设计的例子,而这些例子对于初学者来说也明显过于复杂。
最要命的是,(第4版)我已经看得相当粗略,但依然发现了几处严重的错误,不是笔误也不是印刷问题,为排除翻译出错的可能,特意比照了英文原版,(同时也排除了C标准版本的因素)确实有错(下面例举两处,尚未学C的朋友请直接跳过)。此外,不少地方讲得不够清楚,我本怀着崇敬之情拜读,结果最终对其印象并不太好。
错误1(第5版修复)
P267关于realloc()函数:显然,第二个参数的值不应超过以前分配的字节数。否则,新分配的内存将与以前分配的内存区域大小相同。
原版P270:Obviously the value of the second argument should not exceed the number of bytes that was previously allocated. If it is, you will only get a memory area allocated that is equal to the size of the previous memory area.
错误2(第5版未修复)
P462关于流:流是外部数据源或数据目的地的抽象表示,所以键盘、显示器上的命令行和文件都是流。……将数据写入流(即磁盘文件)有两种方式。
原版P468:A stream is an abstract representation of any external source or destination for data, so the keyboard, the command line on your display, and files on disk are all examples of streams....There are two ways of writing data to a stream that is a disk file.
第5版的改动非常小,将第4版九成内容照搬,就最后增加了一章“Advanced and Speciallized Topics”(高级专用主题),介绍Unicode、线程等,讲得也不易理解甚至不知所云。倒是在排版上有所进步,更适于阅读,如果你硬要来上一本,第5版会更好一些。
《嗨翻C语言》(588页)推荐指数:★★★★☆
莫被这厚度吓怕,它的字很大,空白很大,图片很多……如果把一般的专业书比作word文档,那么《嗨翻C语言》就是ppt,各种字体,各种插图(即使多数只意增加趣味而与正式内容关联不大),你会觉得眼前一亮,比如:
右下那壮汉居然在想(说?):“可我喜欢这一张,上面有小猫咪呢!”诸如此类数不胜数,随便翻开一页都能碰到这样个无厘头的吐槽或疯话,恶搞无极限;知识点与剧情饱满的故事结合在一起,想忘都难;译者也幽默风趣,做了不少本土化的工作,比如“三位钻石王老五准备参加今天的‘非诚勿扰’”……总体感觉甚至像一本幼儿园的启蒙画册。(Head First系列都这个无脑样我会乱说?)
在开讲知识点前先引导读者自己思考,猜猜这些东西是干啥的,甚至时常让你站在编译器或者语言设计者的角度思考问题,这些做法很独特,让你从一开始就从很本质的层面去接触C;同时督促读者动脑,练习题有趣而简短,提示、答案及讲解也非常到位。然而书里充斥着鲜明的老美风格,很high很激情,可以想象美国学生读了本书极可能做出很实际很创意的东西,而中国的学生读着可能感觉反而有点混乱。并且它起点不低,相当不低,明确地说,适合学过其他语言(如Python)的人用来学C,后半部分的高级应用更是涉及操作系统和网络的知识,尽管它也做了简单介绍,但我相信没接触过的朋友一下子还是难以接受的。
《C语言点滴》(302页)推荐指数:★★★★★
看得出作者确实是个有热情有想法的好老师,语言轻松幽默有内涵,跑上来1.1节装备篇大话程序员屌丝着装就能闪瞎你眼。真正意义上的由浅入深,一开始浅得连水都没有,然后不知不觉就潜到了马里亚纳海沟。内容并不系统,比起其他的C语言书,它不是教材而是教辅,更多的是总结性的东西(使用技巧注意事项什么的)——作者总结了自己教学过程中常见的问题与经验,参考了一些经典之作,对其中内容进行了二次包装之后以更易理解的方式呈现给读者——而与其说是查漏补缺的教辅,其实又更像是心得写得不错的系列博文,无论你对C掌握程度如何,读一下多少会有所收获。
那么之于初学者,相比零基础或学过其他语言,你最好是学过一点C,哪怕只有一丁点。有不少术语是在不解释的情况下出现的,你手头最好还有一本主力教材。本书专打辅助,但把重难点剖析得十分清楚,对初学者快速、准确地掌握知识点很有帮助。如果你有地方看不明白,不必焦虑,它本来就是“点滴”,暂时漏掉几滴无伤大雅,日后再补不迟。
PS:全书没啥可吐槽的,唯独1.2节安排不佳:从搜索引擎、e-mail、聊天工具、社交网站、论坛、博客、下载说起,哦不,是教起,准确地说是零基础教起,虽然说得挺有意思,但其实没有必要,现在只要有点文化水平的,即使是小学生甚至幼儿园的小朋友也都会上网,而没有文化水平的,不识字的,也根本不会用电脑,更不可能来看C语言,换个角度,学C的读者还不会上网吗,这些东西是写给谁看呢?