《[免费下载 c语言深度解剖[1]》

下载本书

添加书签

[免费下载 c语言深度解剖[1]- 第1部分


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!


…解开程序员面试笔试的秘密

以含金量勇敢挑战国内外同类书籍

陈正冲编著
石虎审阅



版权申明


本书尚未出版,先放到网上给大家免费
下载和阅览。本书正式出版前读者可以仔细
研读和自由传阅本书电子版,但不允许私自
大量印刷和销售。出版社如想出版此书可通
过邮件或博客留言联系作者商谈出版事宜。

对于非法盗印或盗版,作者将本着愚公
移山的精神,孜孜不倦的与盗版者周旋,直
至法律做出公正的裁决。


写在前言前面的话


最近面试了一些人,包括应届本科、硕士和工作多年的程序员,
在问到 
C语言相关的问题的时候,总是没几个人能完全答上我的问
题。甚至一些工作多年,简历上写着“最得意的语言是 
C语言”,“对
C有很深的研究”,“精通 
C语言”的人也答不完全我的问题,甚至有
个别人我问的问题一个都答不上。于是我就想起了我去年闲的使用写
的这本小册子。

这本小册子已经在我电脑里睡了一年大觉了。并非没有出版社愿
意出版,而是几个大的出版社都认为书写得不错,但太薄,利润太低,
所以要求我加厚到 
300页以上。我拒绝加厚,并为此和几个出版社僵
持了一年多。我认为经典的东西一定要精炼,不要废话。这次由于面
试别人,所以终于记起了我还写过这么一本小册子。想了想,还是决
定挂到网上免费让大家看得了。并为此专门为本书开了个博客,以方
便和读者交流。博客地址:blog。csdn/dissection_c

作者简介:

陈正冲:湖南沅江人,毕业于长春光学精密机械学院(长春理工
大学)数学系。目前从事嵌入式软件开发和管理方面的工作。

石虎:湖南沅江人,毕业于吉林大学计算机系。目前为大连交通
大学计算机系讲师。


前言

我遇到过很多程序员和计算机系毕业的学生,也给很多程序员和计算机系毕业的学生讲
解过《高级 
C语言程序设计》。每期班开课前,我总会问学生:你感觉 
C语言学得怎么样?
难吗?指针明白吗?数组呢?内存管理呢?往往学生回答说:感觉还可以, 
C语言不难,指
针很明白,数组很简单,内存管理也不难。一般我会再问一个问题:通过这个班的学习,
你想达到什么程度?很多学生回答:精通 
C语言。我告诉他们:我很无奈,也很无语。因
为我完全在和一群业余者或者是 
C语言爱好者在对话。你们大学的计算机教育根本就是在
浪费你们的时间,念了几年大学,连 
C语言的门都没摸着。现在大多数学校计算机系都开
了 
C、C++、Java、C#等等语言,好像什么都学了,但是什么都不会,更可悲的是有些大学
居然取消了 
C语言课程,认为其过时了。我个人的观点是“十鸟在林,不如一鸟在手”,真
正把 
C语言整明白了再学别的语言也很简单,如果 
C语言都没整明白,别的语言学得再好
也是花架子,因为你并不了解底层是怎么回事。当然我也从来不认为一个没学过汇编的人
能真正掌握 
C语言的真谛。我个人一直认为,普通人用 
C语言在 
3年之下,一般来说,还
没掌握 
C语言;5年之下,一般来说还没熟悉 
C语言;10年之下,谈不上精通。所以,我
告诉我的学生:听完我的课,远达不到精通的目标,熟悉也达不到,掌握也达不到。那能
达到什么目标?…领你们进入 
C语言的大门。入门之后的造化如何在于你们自己。不过我
可以告诉你们一条不是捷径的捷径:把一个键盘的 
F10或 
F11按坏,当然不能是垃圾键盘。

往往讲到这里,学生眼里总是透露着疑虑。 
C语言有这么难吗?我的回答是:不难。但
你就是用不明白。学生说:以前大学老师讲 
C语言,我学得很好。老师讲的都能听懂,考
试也很好。平时练习感觉自己还不错,工作也很轻松找到了。我告诉学生:听明白,看明
白不代表你懂了,你懂了不代表你会用了,你会用了不代表你能用明白,你能用明白不代
表你真正懂了!什么时候表明你真正懂了呢?你站在我这来,把问题给下面的同学讲明白,
学生都听明白了,说明你真正懂了。否则,你就没真正懂,这是检验懂没懂的唯一标准。
冰山大家都没见过,但总听过或是电影里看过吧?如果你连《泰坦尼克》都没看过,那你
也算个人物(开个玩笑)。《泰坦尼克》里的冰山给泰坦尼克造成了巨大的损失。你们都是
理工科的,应该明白冰山在水面上的部分只是总个冰山的 
1/8。我现在就告诉你们,C语言
就是这座冰山。你们现在仅仅是摸到了水面上的部分,甚至根本不知道水面下的部分。我
希望通过我的讲解,让你们摸到水面下的部分,让你们知道 
C语言到底是什么样子。

从现在开始,除非在特殊情况下,不允许用 
printf这个函数。为什么呢?很多学生写完
代码,直接用 
printf打印出来,发现结果不对。然后就举手问我:老师,我的结果为什么不
对啊?连调试的意识都没有!大多数学生根本就不会调试,不会看变量的值,内存的值。
只知道 
printf出来结果不对,却不知道为什么不对,怎么解决。这种情况还算好的。往往很
多时候 
printf出来的结果是对的,然后呢,学生也理所当然的认为程序没有问题。是这样吗?
往往不是,往后看,你能看到例子的。永远给我记住一点:结果对,并不代表程序真正没
有问题。所以,以后尽量不要用 
printf函数,要去看变量的值,内存的值。当然,在我们目
前的编译器里,变量的值,内存的值对了就代表你程序没问题吗?也不是,往后,你也会
看到例子的。

这个时候呢,学生往往会莫名其妙。这个老师有问题吧。大学里我们老师都教我们怎么
用 
printf,告诉我们要经常用 
printf。这也恰恰是大学教育失败的地方之一。很多大学老师根
本就没真正用 
C语言写过几行代码,更别说教学生调试代码了。不调试代码,不按 
F10或F11,
水平永远也无法提上来,所以,要想学好一门编程语言,最好的办法就是多调试。你去一
个软件公司转转,去看人家的键盘,如果发现键盘上的 
F10或 
F11铮亮铮亮,毫无疑问,
此机的主人曾经或现在是开发人员(这里仅指写代码的,不上升到架构设计类的开发人员),


否则,必是非开发人员。

非常有必要申明,本人并非什么学者或是专家,但本人是数学系毕业,所以对理论方面
比较擅长。讲解的时候会举很多例子来尽量使学生明白这个知识点,至于这些例子是否恰
当则是见仁见智的问题了。但是一条,长期的数学训练使得本人思维比较严谨,讲解一些
知识点尤其是一些概念性原理性的东西时会抠的很细、很严,这一点相信读者会体会得到
的。本书是我平时讲解 
C语言的一些心得和经验,其中有很多我个人的见解或看法。经过
多期培训班的实践,发现这样讲解得比较透彻,学生听得明白。很多学生听完课后告诉我:
我有生以来听课从来都没有听得这么透彻,这么明白过。也有业余班的学生甚至辞掉本职
工作来听我的课的。

当然,关于 
C语言的这么多经验和心得的积累并非我一人之力。借用一句名言:我只
不过是站在巨人的肩膀上而已。给学生做培训的时候我参考得比较多的书有:Kernighan 
& 
Ritchie的《TheC 
Programming 
Language》;Linden的《ExpertC 
Programming》; 
Andrew& 
Koening《CTrapsand 
Pitfalls》; 
SteveMaguire的《WriteClean 
Code》;Steve 
McConnell的
《Codeplete。SecondEdition》;林锐的《高质量 
C++/C编程指南》。这些书都是经典之
作,但却都有着各自的缺陷。读者往往需要同时阅读这些书才能深刻的掌握某一知识点。
我的讲课的试图时候融各家之长,再加上我个人的见解传授给学生。还好,学生反映还可
以,至少还没有出乱子。这些书饱含着作者的智慧,每读一遍都有不同的收获,我希望读
者能读上十遍。另外,在编写本书时也参考了网上一些无名高手的文章,这些高手的文章
见解深刻,使我受益匪浅。这里要感谢这些大师们,如果不是他们,肯怕我的 
C语言的水
平也仅仅是入门而已。

学习 
C语言,这几本书如果真正啃透了,水平不会差到哪。与其说本书是我授课的经
验与心得,不如说本书是我对这些大师们智慧的解读。本书并不是从头到尾讲解 
C语言的
基础知识,所以,本书并不适用于 
C语言零基础的人。本书的知识要比一般的 
C语言书说
讲的深的多,其中有很多问题是各大公司的面试或笔试题。所以本书的读者应该是中国广
大的计算机系的学生和初级程序员。如果本书上面的问题能真正明白 
80%,作为一个应届
毕业生,肯怕没有一家大公司会拒绝你。当然,书内很多知识也值得计算机教师或是中高
级程序员参考。尤其书内的一些例子或比方,如果能被广大教师用于课堂,我想对学生来
说是件非常好的事情。有人说电影是一门遗憾的艺术,因为在编辑完成之后总能或多或少
的发现一些本来可以做得更好的缺陷。讲课同样也如此,每次讲完课之后总能发现自己某
些地方或是没有讲到,或是没能讲透彻或是忘了举一个轻浅的例子等等。整理本书的过程
也是,为了尽量精炼,总是犹豫一些东西的去留。限于作者水平,书中难免有些遗漏甚至
错误,希望各位读者能予指教。作者 
Mail:dissection_c@163。

陈正冲 


2008年 
6月 
23日


目录

第一章关键字 
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。9 


1。1,最宽恒大量的关键字auto。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11 


1。2,最快的关键字register。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 
11 


1。2。1,皇帝身边的小太监寄存器。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11 


1。2。2,使用 
register修饰符的注意点。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11 


1。3,最名不符实的关键字static。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12 


1。3。1,修饰变量。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12 


1。3。2,修饰函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。13 


1。4,基本数据类型short、int、long、char、float、double。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。13 


1。4。1,数据类型与“模子”。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。14 


1。4。2,变量的命名规则。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。14 


1。5,最冤枉的关键字sizeof。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。18 


1。5。1,常年被人误认为函数。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。18 


1。5。2,sizeof(int)*p表示什么意思?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。18 


1。4,signed、unsigned关键字。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。19 


1。6,if、else组合。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。20 


1。6。1,bool变量与“零值”进行比较。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。20 


1。6。2;float变量与“零值”进行比较。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。21 


1。6。3,指针变量与“零值”进行比较。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。21 


1。6。4,else到底与哪个 
if配对呢?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。22 


1。6。5,if语句后面的分号。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。23 


1。6。6,使用 
if语句的其他注意事项。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。24 


1。7,switch、case组合。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 
24 


1。7。1,不要拿青龙偃月刀去削苹果。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 
24 


1。7。2,case关键字后面的
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架