猛批烂书 程序员面试宝典 上

上传人:kms****20 文档编号:40946992 上传时间:2018-05-27 格式:DOC 页数:13 大小:40.50KB
返回 下载 相关 举报
猛批烂书 程序员面试宝典 上_第1页
第1页 / 共13页
猛批烂书 程序员面试宝典 上_第2页
第2页 / 共13页
猛批烂书 程序员面试宝典 上_第3页
第3页 / 共13页
猛批烂书 程序员面试宝典 上_第4页
第4页 / 共13页
猛批烂书 程序员面试宝典 上_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《猛批烂书 程序员面试宝典 上》由会员分享,可在线阅读,更多相关《猛批烂书 程序员面试宝典 上(13页珍藏版)》请在金锄头文库上搜索。

1、猛批烂书猛批烂书 程序员面试宝典程序员面试宝典 上上猛批烂书 程序员面试宝典 上最近看到一本烂书,本来忽略过去就是了,可惜这本烂书还挺流行,为了阻止它继续误人子弟,我不得不花点时间出来,猛批此书,请大家不要上当,买了此书的赶快销毁不要扔掉,以免别人捡去上当,打算买的先来看看我的意见再做决定,把此书借给别人的赶快要回来销毁,从别人那里借了此书的赶快还回并且告诉人家我的意见。我自己在面试和被面试上都有一些经验,在本文最后,我会给出自己在这方面的建议,希望能对大家有所帮助,尤其是那些因为我的文章而放弃了这本烂书的同学,我希望我的建议能填补你这方面的需要。烂书的书名中文名:程序员面试宝典英文名:BES

2、T PRACTICE FOR PROGRAMMER INTERVIEW(小沈阳:我的中文名字是 小沈阳,英文名字是 Xiao Shen Yang)烂的原因这本书的目的是赚钱,完全不是为了提高大家的面试笔试水平,所以出现下面的情况,也是理所当然的了:首先,这本书名字起的好,营销也做的好,否则不会这么流行;可惜内容不好,属于有能力没道德类型的坏人,能力越大,破坏越大。其次,这本书基本上是以一种应对考试的方式来应对找工作的笔试和面试,刚刚从学校出来的同学们正是考试的好手,如果还以这种心态来应对笔试面试后果是很不妙的。最后,这本书当中讲解的东西大部分基础简单的内容都是对的,比较高级的内容偏偏是错的,属

3、于隐蔽的很深的坏人,倒霉了还不知道是谁干的,最坏。这本书我随便翻了翻,几乎气死,哪里有这样介绍东西的?自己都是一知半解,就来编制宝典,真个是以己之昏昏明人之昭昭啊。还忽悠那么多刚刚或者即将步出校门的同学从微薄的生活费里挤出三十九块钱买来上当。编书的赚到钱了,同学们找不到工作他们可不管本来我也不用管,可是我的女朋友也在找工作,也买了这本烂书(可以吃多少个排骨啊!) ,我就不能不管了!下面,我会把这本书当中的错误、混乱、语无伦次、蒙混过关之处,只选择我随便翻翻出来的一小部分罗列出来,让大家看看这本书的真面目是如何的烂。这并不是说这本书就只有我列出来的这些问题,还有更多我看到了没有写(没功夫,也不想

4、把他们教聪明了) ,更多更多的是我没发现的。另外,我个人只对 C/C+/STL 有深入的认识,所以,我也只对这方面揭批一下,请对其他方面精通的好同志在其他地方揭批其他方面,也请精通 C/C+/STL 的好同志对我的错误不吝赐教。烂的方面对第六章到第九章,我随手翻了翻,第十章我看的比较仔细,因为我对 C+面向对象很感兴趣。后面的,由于第十章里面错误太多,我没有看以免气到自己(很多地方写的,态度非常成问题!完全是在敷衍,我真怀疑他们写这么一厚本书花的心思,有没有我写这篇短文的心思多?)6.4 内联函数和宏定义,在这一个小节当中的问题如下:首先,这个小节的写作态度不认真水平很马虎:这个小节大概是在网

5、上搜了搜关于 inline 和宏就写完了,所以只是语无伦次的介绍了基本概念,但是没有涉及任何高级特性他们绝对不是为了避免读者无法理解而不涉及高级特性的,而是他们自己不懂,否则的话,我不相信这帮人会不抓紧卖弄一下自己的“学识” 。如果你想知道这个小节有多垃圾,就去看看 msdn 上关于 inline 的介绍,或者 TPCL 当中对 inline 的介绍就可以了。其次,罗嗦得语无伦次且不着重点:内联函数和宏定义的区别,大概只要几句话就可以说清楚,这本书用了几段话反而说糊涂了,而且最重要的一句话,没说(参见第五) 。第三,把清楚的解释糊涂了:原文当中有这样一句“对于短小的代码来说,inline 可以

6、带来一定的效率提升,而且和 C 时代的宏函数相比,inline 更安全可靠。可是这个是以增加空间消耗为代价的。 ”按照这两句话的意思,inline 增加空间消耗换来的是比宏更加安全?知道的自然明白是书上漏了一句话,不知道这不就被蒙了?读烂书还是马虎点好,不是被蒙就是被气。实际情况是,inline 增加空间消耗换来的是效率提高,这方面和宏是一模一样的,但是inline 在和宏相比没有付出任何额外代价的情况下更安全。第四、例子像浆糊一样,注释像例子一样:唯一的一个例子,我不厌其烦的抄录如下、inline fac(float i) return i * i;/没有写返回值printf(“bb = %

7、d“, fact(8);/调用时就是执行 printf(“bb = %d“, 8 * 8);这个例子和其中的注释,想说明什么问题?能说明什么问题?我估计,想说明的问题是 inline 和宏一样可以展开,但是那个自作聪明的注释,实在费解,干嘛不写返回值?在华为这样写函数连看门的大爷都会上来鄙视一下,这本书里还当例子拿出来。我估计写这个例子的作者,根本不知道如果一个函数不写返回值的话编译器是如何处理的(本科二年级 C 语言 80 分以上的都应该知道) ,他的意图是向读者展示 inline 函数确实仅仅是扩展开,即使没有返回值也没有关系,因为 inline 函数仅仅扩展开就可以了,不需要返回值他的意

8、图完全错误。而且,调用时候执行的根本不可能是注释当中写的那样,也根本不是例子里面展示的那样会展开,具体如何,请看第五条罪状。第五、inlinle 函数最重要的一个特性没有说到:这个特性是什么?请你自己先写一个程序(或者复制我的):#include inline int fact(int i) return i * i;int main()printf(“%d“, fact(8);把这个程序在 VS2003 当中编译一下,然后分别在 Debug 和Release 模式下进行调试,断点放在 printf 那一行,程序暂停以后点击右键,选择“Go to disassemlby” ,进入到汇编码,在

9、Debug模式下,你会看到这样的情况:、printf(“%d“, fac(8);00411D3E push 8 00411D40 call fact (41168Bh) 00411D45 add esp,4 00411D48 push eax 00411D49 push offset string “%d“ (42B01Ch) 00411D4E call ILT+1500(_printf) (4115E1h) 00411D53 add esp,8 在 release 下你会看到这样的情况:printf(“%d“, fac(8);00401000 push 40h 00401002 push o

10、ffset string “%d“ (4060FCh) 00401007 call printf (401012h) 0040100C add esp,8 如果你还没有体会出来,提示一下,在 debug 模式下有一个call fact,fact?怎么那个 inline 函数被调用了?不是说展开么?但是在 release 模式下,你看到 8 * 8 了没?只有一个 40h,把这个十六进制的数字换算成十进制同样,为什么也没有展开呢?总之,是没有按照那本书例子当中注释说的执行,为什么呢?原因在 msdn 里说的很清楚:The insertion (called inline expansion or

11、 inlining) occurs only if the compilers cost/benefit analysis show it to be profitable. 编译器只在计算之后认为值得的时候才会扩展 inline 函数。这么小一个知识点就能犯这么多错误,也只有这本烂书能做到了。7.1 节 面试例题 3这只是一道例题,但是非常典型的展示了这本书是如何的避重就轻的解释问题和作者自己的 C+真实水平。题目如下:Which of the following is NOT true about the “this“ pointer of class X?A. It lets each

12、object of class X to access its address. (让 X 类的每一个对象指向它的地址)B. It will be implicitly passed as argument of every non-static member function of class X. (可以隐性传递 this 指针)C. It can not be used explicitly in memeber function of class X. (不能在类的成员函数里明确的声明)D. Its type is const X* in const member function o

13、f class X. (它是常量函数中的一个常量指针)答案是 C,原书的解释我就不抄了,仅仅解释了 this 的用法,还给出了一段完全不着调的例程,对于问题当中考察的四个要点,都没有介绍原因,仅仅解释了一下 this 的用法,就算解析完成了?这和告诉读者,this 指针的拼写是 t-h-i-s 有什么区别?这还不是最大的问题。最大的问题在于添加的那些翻译,这些翻译是书的作者添加的,不是我加的。如果对着那些翻译,你能选出 C 来吗?ACD 都可以选,B 之所以不选是因为不知所云。我来给个翻译:A. this 指针让 X 类的对象能够访问自己的地址(关键点:every和 each 的区别,acce

14、ss 的词义)B. this 指针会被隐性的当作一个参数传递给 X 类的每一个非静态函数(关键点:翻译以前要看懂原文)C. this 指针不能在 X 类的成员函数里显式声明(关键点:恰当使用专业术语,汉语可以没有宾语但是不能没有主语)D. 在 X 类的经过 const 修饰的成员函数里,this 指针的类型是const X*(关键点:翻译以前不可以误解原文)想到 6.4 节里那个莫名其妙的注释,这里出现歪曲原意的翻译也是很自然的了,这帮人莫非是用金山快译翻译的?还是盗版的?8.1 节 面试例题 1这个题目给出了一个计算阶乘的例子程序,是错的,首先编译无法通过,有语法错误;其次逻辑有错误,没人能

15、预料到它的输出是什么;最后编码风格很烂,这样写代码的人,只能去此书编辑部上班,其他公司都不会要的总之错的我很无语,这还是示例,我看这是典型错误示例还差不多!写出这样程序的人,需要回炉重造,从 if-else 开始重学四年编程再说;而把这样程序当例子做示范的人么,只能去编书,对,就是编一本英文名字是“BEST PRACTICE FOR PROGRAMMER INTERVIEW”的书。来吧,买书了的请把书翻到 83 页,看“答案”两个字下面的东西;没书的看这里,我抄上来了:int n,t;int find(int n);if (n=1) t=1;elsereturn find (n-1) * n;

16、main()cin n;find(n);printf(N!=, t:1:0);看了以后我就想问,这个是什么语言?看到 main 函数,应该是C/C+,可是最后一行的 t:1:0 是什么语义?看到用单引号表示字符串,应该是 Pascal,但是输出时候用的 printf 是哪种 Pascal 里的函数?当 n=2 的时候,函数会返回什么?为什么要用一个 t 来保存结果?n 只在 main 函数里面用了,为什么要定义成全局变量?判断条件里的 n=1,这错误犯的,我想问问,这本书的作者,你刚开始学 C 语言吧?知道 C+怎么拼吗?我告诉你:C-p-l-u-s-p-l-u-s。连个阶乘都写不好,还来教别人怎么笔试面试?二十行不到的程序错误一大堆,还来当例子程序?而且这是多么低级的错误啊,我好久没见到过了。还拿来当例子程序是在编笑话书吗?把这

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号