关注 C++ Primer Plus(第 6 版)的同学,请留步
2012-06-19
鉴于最近关注《C++ Primer Plus》第 6 版的广大编程爱好者日益增多,看来有必要在这里客观地评价一下这本书。
《C++ Primer Plus》第 6 版在美国刚上市不久,我就购买了原版书学习,可以说是第一批看这本书最新版的人。经过半年认真地学习,对这本书有自己客观的看法。本人不推荐初学者以这本书作为教材。现在如果你对这本书感兴趣,请耐心阅读以下文字,这是作为一个过来人的劝告。
不知道之前在网上推荐《C++ Primer Plus》的人是否真正认真阅读过本书?抑或是几年前读过?
刚开始我对这本书抱有极大地热诚,非常认真地学习本书,书中的每句话几乎都反复阅读推敲,亲手从键盘上把书中的所有例题敲进电脑运行,所有的课后习题都认真地写过。我相信自己的评价是非常客观的。客观地说,这是一本 C 语言与 C++ 杂糅的书,并非真正从 C++ 的角度教你学 C++。学完本书后,你不会掌握 C++ 的编程思想,存于你脑中的只有无数乱七八糟零散的知识点。甚至,当你回忆起貌似在这本书学到的某个知识点,想再次翻阅本书进行查找时,你会有想把书撕掉的感觉。这既不是一本很好的 C++ 入门教材,也不是一本方便查阅的参考书。因为这本书的知识体系极其混乱,除了徒增你的查找时间和挑起你的脾气外,别无它用。
1. 首先谈谈本书的错误
这本书的错误极多!第 5 版是这样,第 6 版竟然没有丝毫修正,错误仍然大模大样地摆在那里。文字,例题,课后习题…到处都可发现各类错误。当你运行书中例题得到的输出和书上的输出不一样时,别奇怪,你的输出是对的,书上的输出是该例题还未修改时的输出。作者修改了例题,但未修改输出。参见英文原版第 6 版 P533 Listing 10.6 usestock1.cpp ,输出的Share Price: $后的数字应为小数点后三位有效数字,而不是书上印的两位。
我不得不一边阅读一边修改。小错误还可以理解,糟糕地是经常出现不知所云的状况,查阅第五版的英文版才发现,原来的例题删除了或者修改了,但是相应的变量名却没有修改。参见英文原版第 6 版 P551 中,Len 是什么?根本没有 Len,应替换成 Moths,数字 30 也应该替换成 12。
还有直接分析错知识点的。参见英文原版第 6 版 P322 ,标题为 The Implications of Using Arrays as Arguments 的这一段。该段开头在分析 Listing 7.5,把主调函数和被调函数之间调用与被调用的关系分析错。导致读者不知道怎样理解主调函数和被调函数中的 argument(实参)和 parameter(形参)。为此,当时想联系作者,奇怪的是书中和网上根本找不到作者的联系方式,书中只有出版商的邮箱,而出版商明确表示不会答复有关书中的技术问题。作者不留下联系方式,读者发现错误时如何与之联系?这也许是错误遗留书中的一个原因,抑或作者就没想去更正?
有错误不要紧,只要提供完整的勘误表,还是可以理解的。这本书总共 1420 页,可是官方网站的勘误表只更新到P478。官方刊物表
我很负责任地告诉大家,错误绝不止这些!即使在提供的这些勘误中还有诸多错误遗漏,P478 以后的错误更多。难道他们知道错误太多不好意思再更新?实在没有必要把你宝贵的时间浪费在找错误上。这些足以说明作者和出版商的态度,自己出书都不负责更新勘误表,错误从第五版保留到第六版。既然作者都不操心,我们又何必煞费苦心呢?
2. 再聊聊本书的 C++11
《C++ Primer Plus》第 6 版是打着 “涵盖 C++11 新内容” 的旗号出版的。当你仔细阅读本书后会有深刻体会,作者只是把 C++11 的新内容强加入书中,哪个知识点 C++11 有更新,就在介绍完这个知识点后附带说一下 C++11 有什么变化,然后依旧我行我素,仍然使用未更改之前的版本。读者最想知道的是如何应用这些 C++11 的新内容,新变化与之前的有什么不同,为什么要做修改更新?这些问题在本书中找不到回答。作者只是简单介绍新标准的知识点,先强硬塞入部分文章中,然后在书末尾增加18章介绍C++11新标准。可以说 C++11 的内容并没有真正融入书中,读者学到的只是以前 C++。
举个例子,书中介绍了 C++11 的 nullptr 空指针代替原来的 NULL,但是在例题中到处都是 NULL,并未做更新。特别是第 16,17 章,书中的例子几乎完全没有改动,还是第五版的例子。要知道第5版是 2004 出版,第6版 2011年出版,跨度七年,却没有重新编排,介绍了 C++11 却不在例题中体现新特新。抓准读者想了解 C++11 新特性的心理,仓促出版,这完全是圈钱行为。
3. 这本书是从C语言的角度教学
随着深入学习本书才慢慢意识到,这本书是从 C 语言的角度来教你学 C++。除非你想这样,否则这绝不是个很好的学习方法。这将导致你学完整本书对 C++ 的编程思想毫无头绪,完全迷失在无数细节中。这些细节很多还是 C 语言遗留的并非C++特有的(例如:在你脑中只有 C 语言的类型转换 (int) x,而不是 C++ 的类型转换 static_cast<int> x)。悲剧吗?学完了《C++ Primer Plus》你还需要另外找本专门讲 C++ 的入门书来看,查缺补漏哪些 C++ 基础知识没学到。郁闷不?既然你决定要学习 C++,为什么不一开始就学习并练习 C++ 的知识点,而要花掉半年的时间学习一些残留在 C++ 中的 C?!要学 C 何不去直接看 Brian W. Kernighan 和 Dennis M. Richie 写的超级经典《C Programming Language》,而要在这学 C 和 C++ 的“杂糅体”?如果你真的想学正宗的 C++,想学 C++11 新特性,就不要看《C++ Primer Plus》第 6 版。
4. 总 结
也许《C++ Primer Plus》在前几版(第 4 版)的时候是本不错的书,但书中的错误不及时更正,一版又一版地累计错误,不与时俱进全面修订,为了圈钱而仓促出版,使得这本书完全丧失了经典教材的风范。如果你真的想学好 C++,请不要以这本书为教材。
如果你是位 C++ 小白,对 C++ 毫无了解,这本书绝对不适合你。如果你只想了解并学习 C++11 新特性,这本书绝对不适合你。八月份要出版的《C++ Primer》第 5 版应该是不错的选择,只是这本书实在不适合连变量和循环都不了解的新手。
相比《C++ Primer Plus》第 6 版,《C++ How to Program》算是一本 C++ 入门的好书,该书是国外很多大学的教材,知识点讲解准确详细,归纳总结颇具条理,习题的数量多,难度较大。我手上有原版,这本书完全按照C++的编程思想编排,例题的注释和讲解都非常详尽,很适合初学者。只是第八版还没有中文版。第七版的中文版我看过了,翻译得不太好,语句不通顺,英文式中文,译错都存在。所以,我在这里推荐的是《C++ How to Program》第八版英文版。
鉴于大陆的计算机翻译质量不敢恭维,侯捷先生又不翻译入门书籍,适合真正新手学习的 C++ 书籍很少。能看国外教材绝不看国内教材,能看英文原版绝不看译版(侯捷先生的译版除外)。国内很多译者对所译书籍并未深入理解,以为略知一二即可翻译,加上急功近利的态度,很多译文都未经推敲。相信看过中文译版的同学们都会有所体会。若真想学到最新的知识,只有直接阅读英文一条路可走。