inline int fact(int i) { return i * i;}
int main()
{
printf("%d", fact(8));
}
把这个程序在VS2003当中编译一下,然后分别在Debug和Release模式下进行调试,断点放在printf那一行,程序暂停以后点击右键,选择“Go to disassemlby”,进入到汇编码,在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 offset 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 inlining) occurs only if the compiler's 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 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 of class X. (它是常量函数中的一个常量指针)
答案是C,原书的解释我就不抄了,仅仅解释了this的用法,还给出了一段完全不着调的例程,对于问题当中考察的四个要点,都没有介绍原因,仅仅解释了一下this的用法,就算解析完成了?这和告诉读者,this指针的拼写是t-h-i-s有什么区别?这还不是最大的问题。
最大的问题在于添加的那些翻译,这些翻译是书的作者添加的,不是我加的。如果对着那些翻译,你能选出C来吗?ACD都可以选,B之所以不选是因为不知所云。我来给个翻译:
A. this指针让X类的对象能够访问自己的地址(关键点:every和each的区别,access的词义)
B. this指针会被隐性的当作一个参数传递给X类的每一个非静态函数(关键点:翻译以前要看懂原文)
C. this指针不能在X类的成员函数里显式声明(关键点:恰当使用专业术语,汉语可以没有宾语但是不能没有主语)
D. 在X类的经过const修饰的成员函数里,this指针的类型是const X*(关键点:翻译以前不可以误解原文)
想到6.4节里那个莫名其妙的注释,这里出现歪曲原意的翻译也是很自然的了,这帮人莫非是用金山快译翻译的?还是盗版的?
8.1节 面试例题1
这个题目给出了一个计算阶乘的例子程序,是错的,首先编译无法通过,有语法错误;其次逻辑有错误,没人能预料到它的输出是什么;最后编码风格很烂,这样写代码的人,只能去此书编辑部上班,其他公司都不会要的——总之错的我很无语,这还是示例,我看这是典型错误示例还差不多!写出这样程序的人,需要回炉重造,从if-else开始重学四年编程再说;而把这样程序当例子做示范的人么,只能去编书,对,就是编一本英文名字是“BEST PRACTICE FOR PROGRAMMER INTERVIEW”的书。
来吧,买书了的请把书翻到83页,看“答案”两个字下面的东西;没书的看这里,我抄上来了:
int n,t;
int find(int n);
{
if (n=1) t=1;
else
{
return find (n-1) * n;
}
}
10.1节 面试例题2
这道题目不难,本身没什么问题,问题出在翻译上(又是翻译!):We use keyword class to create a class construct. (我们用关键字类来创建一个类的结构)。
对于第一个class的翻译,我只能说,他们没翻译成“班级”,已经谢天谢地……这一次莫非又用了盗版的金山快译吗?笑话里面扔硬币做选择题的学生还知道重新扔一遍验算一下,难道这帮编书的,就不知道用谷歌翻译验算一下啊?
这本书还有一个章节,是英语面试,罗列了一些常用词汇,我很好奇,这部分,是用什么软件做的?不会还是盗版的金山快译吧?够呛。
10.2节 面试例题2
这个题目是典型的展示了本书作者的态度有多大问题——他们的能力方面显然不及格,但是态度肯定是零分。请看题目吧,重点在解析。
现有以下代码,则编译时会产生错误的是_______。
struct Test
{
Test (int) {}
Test () {}
void fun() {}
};
int main()
{
Test a(1);//语句1
a.fun();//语句2
Test b();//语句3
b.fun();//语句4
return 0;
}