《程序员面试宝典》之错误纰漏(持续更新。。。)

来源:互联网 发布:新手吉他推荐 知乎 编辑:程序博客网 时间:2024/04/30 07:47

好长一段时间忙于找实习,找工作,和很多人一样买了一本《程序员面试宝典》第三版,每个人都似乎不亦乐乎的看着;但是,仔细看书的话还是有很多纰漏在里面,我也看到网上有人狠批这本书就是为了营销,我表示理解。记得有这么一句话,”你应该感谢那些敢于批评和让你陷入窘境的人,因为这样你才能真正的成长“,我不想主观的去评价这本书怎么样,尽管我确实也发现这本书存在很多的纰漏甚至是错误的地方;客观的把这些错误记录下来,希望大家在学习之余也抱着一种敢于怀疑的精神去批判一些东西。(由于本人能力有限,仅把自己看到过的问题记录了下来,肯定有很多疏漏的地方,欢迎各位补充,将不甚感激)。

1.这几天一直在看排序部分,书中207页很明显的错误”增量序列的取值依次为5,3,2,1“。我觉得这部分内容大家可以结合一下这篇博客来理解将很有帮助:http://blog.csdn.net/morewindows/article/details/6668714

2.pp125页 11.2私有继承 这道题似乎出的就有问题,选项上让人难以理解不说,而且解析的过程也让人有点“哭笑不得”的感觉。

B选项“私有继承使父类中的所有成员元素变成私有”,似乎可以说的过去;但是作者给的解析让人不得不怀疑----“子类真的只能继承父类的protected和public吗?”,上网搜了一些资料http://zhidao.baidu.com/question/325807184.html。有证据证明,private成员也被继承了。

#include <iostream>using namespace std;class Parent{public:private:    int x,y;};class Child: public Parent{};int main(){ cout << sizeof(Child) << endl; return 0;}


输出结果8表明继承了私有成员。(个人觉得是这样的)

C选项“私有继承使父类中的函数转化成私有”,“难道仅仅是函数?”,该项暂且不说。

至于D选项原文是(这是一道英文题)“private inherit make every member from parent not-accessible to sub-class",书中翻译为“私有继承使父类中所有元素无法与子类联系”,不禁要问”not-accessible翻译成联系?“,"是父类访问子类?还是子类访问父类?”即便是书中这样翻译的,子类通过成员仍然还是可以访问的,这是毫无疑问的,并且在它随后的“扩展知识”中也证实了这一点。

所以,感觉这道题出的很牵强,而且分析的也不怎么样。

 

3.pp130 将“function”翻译为“方法”。而且表述上,既然不需要链表,答案却偏偏选择了用了链表的一项。(这是在忽悠广大的读者吗?)。

 

4.pp131 对于“扩展知识”当中的包含“brass”和“instrument”这一句话,从何而来?


5.pp56  对于面试例题7,解析讲了半天毫无关系的东西,真让人怀疑有凑数之嫌;而且我也网上查找了一些资料,有的救证实,对于sizeof(string)根本就没有多大意义,因为它是跟编译器有关的。可以参考我转载的这篇文章:http://blog.csdn.net/wenhai_zh/article/details/10285835


6.pp58 例题8,有虚函数那题,解析的也够烂的,再说一个指针的题目,你写这么多,大题小做!而且我觉得作者更明显的意图是指向虚函数表的,而文中就以指针应付了事了。    对于例题10,不得不说明这个解析很牵强,是根据”内存对齐原则“,但不仅仅是要”选择4的倍数“.。努力做过这方面的研究就知道,在char p和int adf[3]之间要插入两个字节,最终是19个字节,然后才是根据4的倍数,扩充到了20;


7.pp72 例题1.这道题的答案是错误的。 第三个和第四个的答案是反过来的,而作者确实如此的马虎了事。


8.对于一个要求严谨的人来说,真的有点看不下去这本书到底有多烂,pp75,扩展知识本来是给人带来更丰富的内容,可是第二段程序漏洞百出,这是要闹哪样?一:ptr[0] = &p;ptr[1] = page2;  //请问从何而来?!!!!!;二:cout << (*B)[3] << endl; ///!!!!!!!!!!!!!!!!!!我就更不明白了,读取一个越界的数,有意思吗?!!!!!


9.对于77页讲述迷途指针这一块,代码和解析之间有点牛头不对马嘴,给出的答案解释更是难以接受。我都暗自在想,作者自己有没有搞懂神马叫迷途指针,神马又叫做空指针!!

int   main()   {       int *pInt = new int;       *pInt=10;     cout<<pInt<<endl;      cout<<"*pInt: "<<*pInt<<endl;       delete pInt;   //pInt为迷途指针!     pInt = 0;//不知道作者自己有没有看到这行代码。         int *pLong = new int;    cout<<pInt<<endl;       cout<<pLong<<endl;    *pLong=90000;       cout<<"*pLong: "<<*pLong<<endl;            *pInt=20;      //再次使用pInt!           cout<<"*pInt: "<<*pInt<<endl;       cout<<"*pLong: "<<*pLong<<endl;       delete   pLong;       return   0;   }

答案给出的是“使用了迷途指针并重新赋值”,而在面试例题2中,自己又写道“可以把迷途指针改为空指针 MyPtr = 0; "暂且不说用0来表示空指针恰当与否,题目中解析中明显自相矛盾,我想在这里详细定义一下迷途指针和空指针;迷途指针是对一个指针进行delete操作后,并没有把它设置为空时产生的。而空指针就是它自身的值(而不是它所指向的值)为空(这个空,其实更标准的写法应该是NULL,而不是简单的就用个0来处理);

既然是这样,而且程序代码中,明显有pInt = 0;将指针变为空指针的语句,而作者却无视它的存在!!!!!!坑爹的一米啊。

经过查找相关资料,http://www.cnblogs.com/CBDoctor/archive/2012/08/01/2618199.html,里面对于空指针的讲解要比书上讲的好很多。

好了,以上讲了这么多,其实还有一个重要的知识点要讲一下------对空指针进行解引用操作时没有定义的行为,所以呢,本题的答案,便是对空指针所指的对象进行了赋值,结果是未定义行为,将会导致不可预期的结果



10.pp129 面试例题2 如果大家在VC++下编译过的话,其实 G和I 两条语句是通过的。

11、pp130面试例题1.翻译的水平以及漏洞百出的解析,害人不浅啊。

12、pp134-135其实我个人觉得多重继承这一章可以少讲或者不讲,一方面确实太难,二是平时也用不到,关在这炒概念一点意思也没有,看了也忘了。而且我发现,面试例题3,这道题简直就是答非所问。

原创粉丝点击