关注 C++ Primer Plus(第 6 版)的同学,请留步_C++Primer Plus书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > C++Primer Plus > 关注 C++ Primer Plus(第 6 版)的同学,请留步
Nina C++Primer Plus 的书评 发表时间:2012-06-19 17:06:58

关注 C++ Primer Plus(第 6 版)的同学,请留步

鉴于最近关注《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++ 书籍很少。能看国外教材绝不看国内教材,能看英文原版绝不看译版(侯捷先生的译版除外)。国内很多译者对所译书籍并未深入理解,以为略知一二即可翻译,加上急功近利的态度,很多译文都未经推敲。相信看过中文译版的同学们都会有所体会。若真想学到最新的知识,只有直接阅读英文一条路可走。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“关注 C++ Primer Plus(第 6 版)的同学,请留步”的回应

云中君 2017-05-22 15:35:01

《C++ How to Program》中文名是《C++大学教程》,现在出到第九版了,有784页呢。最近在看绝版的《Accelerated C++》,感觉还不错,就是语法和Java的有点差别,还要好好消化一番。

亦菲大战奥尼尔 2017-05-19 15:13:29

相对于《c++ primer》, 这本书更像是在教一个不会编程的人一步步学习c++,而《c++ primer》更像是一本c++的知识参考书。

Nina 2015-12-01 22:01:45

《C++ Primer Plus》英文原版第6版,P551:
class Bakery
{
private:
enum {Months = 12};
double costs[Months];
...
Note that declaring an enumeration in this fashion does not create a class data member. That is, each individual object does not carry an enumeration in it. Rather, Len is just a symbolic name that the compiler replaces with 30 when it encounters it in code in class scope.

请问Len是什么?30是什么?

这是《C++ Primer Plus》英文原版第5版,P489
class Stock
{
private:
enum {Len = 30}; // class-specific constant
char company[Len];
...
Note that declaring an enumeration in this fashion does not create a class data member. That is, each individual object does not carry an enumeration in it. Rather, Len is just a symbolic name that the compiler replaces with 30 when it encounters it in code in class scope.

发现了吗?作者改了代码,分析中没改对应的变量。

和梦一起飞99 2015-11-26 09:30:14

没有啊,我手中有一本第6版的英文版,我对照了一下,那些错误好像没有,比如那个months =12,确实是没错的:
C++ has a second way of defining a constant within a class—using the keyword static:
class Bakery
{
private:
static const int Months = 12;
double costs[Months];

这是复制的

polar9527 2015-04-11 21:36:18

瑕不掩瑜

骑海鸥去旅行 2014-01-05 09:14:31

回复楼上,这书本来就不是教你算法的,看算法去看CLRS.

就因为通过cin/cout来输入输出数据就批判整本书,显然是你自己没读懂就来妄加评论。

一些错误当然存在,不过已经有errata修复,即使没有修复的也很容易能看出来。

真不懂30个赞同是怎么点的,首先你们读的如果是翻译我无话可说,因为编程书里的翻译80%都是垃圾。做学问就不要盲从,有自己的看法才是最重要的。

lnj 2013-10-30 17:03:49

看到第16章了,感觉这章拼凑感太强了,没有连续性,全是一个个小的知识点,解释时间复杂度的例子让人完全不知所云。

整本书的每个代码示例和习题都使用cin读入数据,很多和当前知识点无关的垃圾代码(cin、cout)。
示例代码总爱用一些诡异的场景和命名,就好象谢耳朵玩纸牌时念出的咒语一样。

强烈不推荐大家看这本书,这本书就像是c++ primer的“钓鱼书”。

kastier 2013-08-12 19:37:08

感觉很适合初学者

[已注销] 2013-07-18 17:31:44

2013-07-12 15:54:49 顽皮creat

想问一下《c++ primer plus》与《c++ primer》哪个更好?
-----
后者

顽皮creat 2013-07-12 15:54:49

想问一下《c++ primer plus》与《c++ primer》哪个更好?

[已注销] 2013-06-03 14:25:16

nullptr出现的前因后果,在cpp annotation上可见一斑

int function(int);
int function(const char*)

这时候无论是function(0);还是function(NULL);都会resolve到第一个函数去。但是用nullptr就没有这个问题。

书中不用nullptr是可以理解的,因为当时C++11的支持还不好,如果一个初学者抄书里的代码来试验,还要把nullptr一个个手动改掉。

但是用NULL,在C++中通常被认为是一种不好的practice。NULL经常给一些人带来误解(Bjarne Stroustrup的FAQ和C FAQ里都有专门的一个条目),而且在某些古董编译环境里面NULL的定义还不是0…

Solomon 2013-06-02 10:01:17

这本书的错误不多,但是很多错的都令人费解。

windcold 2013-05-14 22:35:02

我不认为这本书很差,比较适合入门者读。编写的风格确实老了点,像C语言,错误有是有,但我觉得什么输出出点小错问题不大,真正有些麻烦的是里面没有教读者编写真正安全可靠的程序,比如它没有指出多态在数组中的危险性。也没有强调C++的类型转换的好处。如果要与时俱进,真正的涵盖c++11,就应当像c++primer 5th一样重写,将c++11的思想与技巧融入到编程中去。但是这本书不可否认的优点是对初学者友好,讲解详细,大部分知识都是一步一步带着你学。无论如何我还是要感谢这本书,是这本书让我学会了很多c++的使用方法,至少比当时读c++ primer门都没入要好很多。读了这本书的人我建议再阅读effective c++作为补充。

Nomad 2013-04-08 15:24:33

才英文。打错了

Nomad 2013-04-08 15:24:20

看的是英文。。才刚开始。之前就是担心翻译,所以才买中文的

肥颓 2013-03-25 07:51:41

LS,别太高估这些英文书的英文难度了,不难的,而且是越读越快的,越读越简单的,不要怕。

nacus 2013-01-22 18:48:20

我的水平远不如楼主,我想多插一句的是——翻译质量实在是不敢恭维。
说翻译质量无疑又装逼之虞,可是,即使对于我这个入门的菜鸟而言,也经常发现错别字,错别字事小,很多明显的错译,如不细读则会完全误解。比如少了“不”,把“因为”写成“因此”,比较级的双方顺序弄反。。。本来想举些例子,但是因为是别人的书没有明显的标注,只是轻轻划了一下,很难找到了。。。
而我的英文水平,又没办法读原著。还是老老实实看完这本再说吧~

CJ 2012-11-15 16:49:10

我C++ how to program中文第七版看了100多页,觉得翻译的不错,可以使用。这书本身就有一种喜欢抛概念的坏毛病,导致书本身有时候较艰涩。另一些时候,则是太罗嗦。

翻译在一般性的关键词译文边列出英文,比较戴特尔系列另一本C how to program这是一个进步,当然那本也是可以读的。

对于可以使用的翻译书,一般配合英文电子版查阅是个好办法。我感觉对于技术类书,汉语是一种不准确的语言,英式中文不一定是绝对的翻译缺陷,句式转换可能会丢失原文意思。即便如此,lost in translation还是常常发生。

翻译不好会祸害读者;危言耸听也会使读者错过好书,祸害读者。开炮很容易,客观负责很难,所以豆瓣后一种祸害属多数,看评论的时候要当心。

Roloo 2012-11-14 20:17:34

请教楼主三个问题:

1:“楼主不推荐初学者以这本书作为教材” 那请问楼主推荐初学者以哪本书作为教材?

2:学C++ 要先学C语言吗?

3:楼主是先学C++ 还是先学C语言? 还是只学C++的呢?

孤独书生 2012-11-14 14:47:20

人个觉得,这本书还是比较适合初学者的。初学者认真通读本书能给打下较为牢靠的基础。至于查阅,这本书做的确实不够。但是我认为就某一问题进行查阅,虽然C++ Primer书后有详细的索引,但最快最好的方法当属Google。

meiwm 2012-10-19 16:08:09

错误什么的一大堆不说~~ 整个结构混乱不堪~~ 东拉西扯, 楼主还是比较犀利的 竟然还读完了 = = 佩服一个

王子亭 2012-10-14 12:17:20

我看完了第六版中文版,我感觉,错误确实非常多非常多,但是大体的框架还是很好的..

YesSan 2012-08-02 11:17:45

我是在美国亚马逊买的英文原版,不过现在中国亚马逊也有《C++ How to Program》第八版英文版卖。

forsee 2012-07-19 16:28:34

《C++ How to Program》第八版英文版,这个国内也没出版吧?