复习C++,看了点书
冠仔和晓玮最近找我讨论了不少C++问题,这促使我重新拿起书把C++复习了一阵。大二的时候学习C++,看的是《Thinking in C++》,对那些概念、规则记得比较熟,但往往说不清每种特性在实际中到底有什么用,它们为什么要这样设计。前一段时间挑了《The C++ Programming Language》和《C++ Primer》中的部分章节阅读,加之有了几年的工程实践,很多问题也便豁然开朗了。对复习过程最受用的还要算《The Design and Evolution of C++》这本在国内不太流行的书,要知道它的作者同样是C++之父Stroustrup。这本书从技术史的角度阐述了C++的每个特性的设计目的和实现机理,使人对C++一些看似蹩脚的设计不再感到奇怪。它与微软那本《The Old New Thing: Practical Development Throughout the Evolution of Windows》给我们一个共同的启示:在不了解一个事物的历史源由的情况下,不要轻言其设计得愚蠢。像C++和Windows这类相对成熟的产品,每个细节的存在都是有一定道理的。
为检验自己的复习效果,我又借了本这两年买得很火的《程序员面试宝典》(第二版)来。冠仔一看这书,马上提出了他的反对意见,说这书内容很功利,编写很浮躁,还有一些错误。这也倒好,我可以批判性地阅读,看看自己有没有能力把书中的错误找出来,或者给回答得浮躁的问题一个更好的答案。花了两个半天读完,觉得这本书的瑕疵还真是不少,仅以我重点阅读的“C/C++程序设计”部分,就发现了若干错误或不妥的地方:
● 5.2节例题1、2,main()函数的定义不符合标准,要知道“int main()”和“return 0;”是往往考查过程中一个重要的细节;
● 5.6节例题1,源代码中出现了中文字面值,而且没有用wchar_t存储也没有用转义,这是一种依赖于编辑器和编译器的不好的编程习惯;
● 6.2节扩展知识,C++中标准不支持“不写类型默认为int的定义”,“const bufsize;”的首要错误应该是这一条;
● 6.3节例题1,混淆了“位”与“字节”;
● 6.3节扩展知识,尽管看上去VC调整后的3个变量只占了连续的9个字节,但运行时栈里还是要遵循对齐的,char所在的字还是有3个字节未用,这和gcc(Dev-C++)没有本质区别,并非减少浪费。要想说明编译器“聪明”,可以多写几个char和int穿插,但这种调整布局的优化VC/gcc都会做,无所谓谁更“聪明”;
● 7.2节例题2,“全局区域的值是不能进行修改的”表述有误,应该强调字符串常量保存在只读的数据段,而不是像全局变量那样保存在普通数据段(静态存储区);
● 10.2节例题2,对“Test b();”的解释含糊不清,其实它就是一个参数为void、返回为Test对象的函数的声明,把这一点讲出来,答案自然就清楚了;
其它还有一些没有回答到点子上的问题,就不一一例举了。尽管如此,我还是从中学到了一些在经典教材上没有注意到的问题,比如C和C++下const变量默认连接规则的不同(6.2节)、volatile变量使用时的注意事项(11.2节)等。总体来说,《程序员面试宝典》为面试突击看看还行,但不要把里面的字字句句当圣经——它很多地方经不起推敲。





6条评论 关于 “复习C++,看了点书”
由 tina 发表于2009-06-15
买了还没看,幸好看前读了你这篇博客...
由 xlgeng 发表于2009-09-15
要找工作了,刚买了这本书,准备突击一下,也找找里面的错误
由 xlgeng 发表于2009-09-15
评论怎么总出错呢?
由 well 发表于2009-10-15
5.4.1
~的优先级高于 >>
由 well 发表于2009-10-15
5.4.2
(int)a 的结果依赖编译器,gcc 4.1 的结果是 1
由 Jian Lin 发表于2009-10-15
@well 呵呵,看来面试前拿这本书突击的朋友要多注意一下了。不过要是时间稍微多一点,把里面的错误都找出来,也会有进步的。