历史

本书改编和包含了以下两本书的部分章节,这两本书均以 GNU Free Documentation License 发布。

前言

这本书有什么特点?面向什么样的读者?

这本书最初是为北京亚嵌教育研究中心的嵌入式 Linux 系统工程师就业班课程量身定做的教材之一。该课程是为期四个月的全日制职业培训,要求学员毕业时具备非常 Solid 的 C 编程能力,能熟练地使用 Linux 系统,同时对计算机体系结构与指令集、操作系统原理和设备驱动程序都有较深入的了解。然而学员入学时的水平是非常初级而且参差不齐的:学历有专科、本科也有研究生,专业有和计算机相关的也有很不相关的(例如会计专业),以前从事的职业有和技术相关的也有完全不相关的(例如 HR),年龄从二十出头到三十五六岁的都有。这么多背景完全不同、基础完全不同、思维习惯和理解能力完全不同的人来听同一堂课,大家都迫切希望学会嵌入式开发技术,投身 IT 行业,这就是职业教育的特点,也是我编这本书时需要考虑的主要问题。

学习编程绝不是一件简单的事,尤其是对于零基础的初学者来说。大学的计算机专业有四年时间从零基础开始培养一个人,微积分、线代、随机、离散、组合、自动机、编译原理、操作系统、计算机组成原理等等一堆基础课,再加上 C/C++、Java、数据库、网络、软件工程、计算机图形学等等一堆专业课,最后培养出一个能找到工作的学生。很遗憾这最后一条很多学校没有做好,来亚嵌培训的很多学生就是四年这么学过来的,但据我们考查他们的基础几乎为零,我不知道为什么。与之形成鲜明对比的是,只给我们四个月的时间,同样要求从零基础开始,最后培养出一个能找到工作的学生,而且还要保证他找到工作,这就是职业教育的特点。

为什么我说“只给我们四个月的时间”?我们倒是想教四年呢,但学时的长短我们做不了主,是由市场规律决定的。四年的任务要求四个月做好,要怎么完成这样一个几乎不可能的任务?有些职业教育给出的答案是“实用主义”,打出了“有用就学,没有用就不学”的口号,大肆贬低说大学里教的基础课都是过时的、无用的,只有他们教的技术才是实用的,这种炒作很不好,我认为大学里教的每一门课都是非常有用的,基础知识在任何时候都不会过时,倒是那些时髦的“实用技术”有可能很快就过时了。

四年的任务怎么才能用四个月做好?我们给出的答案是“优化”。现在大学里安排的课程体系最大的缺点就是根本不考虑优化。每个过来人都会有这样的感觉:大一大二学了好多数学课,却不知道都是干什么用的,为什么要学。连它有什么用都不知道怎么能有兴趣学好呢?然后到大三大四学专业课时,用到以前的知识了,才发现以前学的数学是多么有用,然而早就忘得一干二净了,考完试都还给老师了,回头重新学吧,这时候才发现很多东西以前根本没学明白,现在才真的学明白了,那么前两年的时间岂不是都浪费了?大学里的课程体系还有一个缺点就是不灵活,每门课必须占一个学期,必须由一个老师教,不同课程的老师之间没有任何沟通和衔接,其实这些课程之间是相互依赖的,把它们强行拆开是不符合人的认知规律的。比如我刚上大学的时候,大一上半学期就被逼着学 C 语言,其实 C 语言是一门很难的编程语言,不懂编译原理、操作系统和计算机体系结构根本不可能学明白,那半个学期自然就浪费掉了。当时几乎所有学校的计算机相关专业都是这样,大一上来就学 C 语言,有的学校更疯狂,上来就学 C++,导致大多数学生都以为自己会 C 语言,但其实都是半吊子水平,到真正写代码的时候经常为一个 Bug 搞得焦头烂额,却没有机会再系统地学一遍 C 语言,因为在学校看来,C 语言课早在大一就给你“上完了”,就像一顿饭已经吃完了,不管你吃饱没吃饱,不会再让你重吃一遍了。显而易见,如果要认真地对这些课程做优化,的确是有很多水份可以挤的。

本书有以下特点:

这是一本从零基础开始学习编程的书,不要求读者有任何编程经验,但读者至少需要具备以下素质:

又是一本 C 语言书。好吧,为什么我要学这本书而不是谭浩强或者 K&R?

谭浩强的书我就不说什么了。居然教学生 include 一个 .c 文件。

K&R 是公认的世界上最经典的 C 语言教程,这点毫无疑问。在 C 标准出台之前,K&R 第一版就是事实上的 C 标准。C89 标准出台之后,K&R 跟着标准推出了第二版,可惜此后就没有更新过了,所以不能反映 C89 之后 C 语言的发展以及最新的 C99 标准,本书在这方面做了很多补充。上面我说过了,这本书与其说是讲 C 语言,不如说是以 C 语言为载体讲计算机和操作系统的原理,而 K&R 就是为了讲 C 语言而讲 C 语言,侧重点不同,内容编排也很不相同。K&R 写得非常好,代码和语言都非常简洁,但很可惜,只有会 C 语言的人才懂得欣赏它,K&R 是非常不适合入门学习的,尤其不适合零基础的学生入门学习。

这本书“是什么”和“不是什么”

本书包括三大部分:

这本书定位在入门级,虽然内容很多,但不是一本百科全书,除了 C 语言基本要讲透之外其它内容都不深入,书中列出了很多参考资料,是读者进一步学习的起点。K&R 的第一章是一个 Whirlwind Tour,把全书的内容简单过了一遍,然后再逐个深入进去讲解。本书也可以看作是计算机专业课程体系的一个 Whirlwind Tour,学习完本书之后有了一个全局观,再去学习那些参考资料就应该很容易上手了。

为什么要在 Linux 平台上学 C 语言?用 Windows 学 C 语言不好吗?

用 Windows 还真的是学不好 C 语言。C 语言是一种面向底层的编程语言,要写好 C 程序,必须对操作系统的工作原理非常清楚,因为操作系统也是用 C 写的,我们用 C 写应用程序直接使用操作系统提供的接口。既然你选择了看这本书,你一定了解:Linux 是一种开源的操作系统,你有任何疑问都可以从源代码和文档中找到答案,即使你看不懂源代码,也找不到文档,也很容易找个高手教你,各种邮件列表、新闻组和论坛上从来都不缺乐于助人的高手;而 Windows 是一种封闭的操作系统,除了微软的员工别人都看不到它的源代码,只能通过文档去猜测它的工作原理,更糟糕的是,微软向来喜欢藏着揶着,好用的功能留着自己用,而不会写到文档里公开。本书的第一部分在 Linux 或 Windows 平台上学习都可以,但第二部分和第三部分介绍了很多 Linux 操作系统的原理以帮助读者更深入地理解 C 语言,只能在 Linux 平台上学习。

Windows 平台上的开发工具往往和各种集成开发环境(IDE,Integrated Development Environment)绑在一起,例如 Visual Studio、Eclipse 等。使用 IDE 确实很便捷,但 IDE 对于初学者绝对不是好东西。微软喜欢宣扬傻瓜式编程的理念,告诉你用鼠标拖几个控件,然后点一个按钮就可以编译出程序来,但是真正有用的程序有哪个是这么拖出来的?很多从 Windows 平台入门学编程的人,编了好几年程序,还是只知道编完程序点一个按钮就可以跑了,把几个源文件拖到一个项目里就可以编译到一起了,如果有更复杂的需求他们就傻眼了,因为他们脑子里只有按钮、菜单的概念,根本没有编译器、链接器、Makefile 的概念,甚至连命令行都没用过,然而这些都是初学编程就应该建立起来的基本概念。另一方面,编译器、链接器和 C 语言的语法有密切的关系,不了解编译器、链接器的工作原理,也不可能真正掌握 C 的语法。所以,IDE 并没有帮助你学习,而是阻碍了你学习,本来要学好 C 编程只要把语法和编译命令学会就行了,现在有了 IDE,除了学会语法和编译命令,你还得弄清楚编译命令和 IDE 是怎么集成的,这才算学明白了,本来就很复杂的学习任务被 IDE 搞得更加复杂了。Linux 用户的使用习惯从来都是以敲命令为主,以鼠标操作为辅,从学编程的第一天起就要敲命令编译程序,等到你把这些基本概念都搞清楚了,你觉得哪个 IDE 好用你再去用,不过到那时候你可能会更喜欢 vi 或 emacs 而不是 IDE 了。

致谢

本书的写作得到北京亚嵌教育研究中心的全力支持,尤其感谢李明老师和何家胜老师,没有公司的支持,我不可能有时间有条件写这本书,也不可能有机会将这本书公开在网上。

然后要感谢亚嵌教育的历届学员和各位老师,在教学和讨论过程中我经常会得到有益的启发,这些都促使这本书更加完善。在本书的写作过程中,很多读者为本书提出很有价值的建议,很多建议是热心网友通过在线评论提的,有些网友我只知道 id 或 email。都列在下面,排名不分先后。

感谢北京亚嵌教育研究中心的老师们:李明,何家胜,邸海霞,郎铁山,朱仲涛,廖文江,韩超,吴岳,邢文鹏,何晓龙,林小竹,卫剑钒。

感谢热心网友:

昵称 邮箱
ddd ddd@clf.net
wuyulei wuyulei0210@163.com
comma commapopo@hotmail.com
田伟 sioungiep@zzxy.org
田雨 tianyu_1123@hotmail.com
daidai daidai0628@sina.com
邓楠 monnand@gmail.com
杜朴风 cplusplus@zzxy.org
Zoom.Quiet zoom.quiet@gmail.com
陈老师 cljcore@gmail.com
杨景 yangbajing@gmail.com
章钰 buptzhangyu@163.com
chen cry2133@gmail.com
Jiawei Zhang rhythm.zhang@gmail.com
waterloo waterloo2005@gmail.com
张现超 zxqianrong@gmail.com
曾宇 uyucn@163.com
董俊波 dongjunbo@gmail.com
RobinXiang dancelinux@gmail.com
刘艳明 lonny_liu@hotmail.com
been2100@163.com
cleverd crossie@qq.com
orange juicerococo@hotmail.com
徐斌 simlink_xub@163.com
cyy cyy198767@hotmail.com
Linux_Xfce coodycody23@gmail.com
冯海云 906702745@qq.com
侯延祥 houyx2008@163.com
churchmice firefoxelectric@gmail.com
linux——00xx00xxooxx codycody23@gmail.com
syfeagle syfeagle@hotmail.com
王公仆 wanggongpu@gmail.com
刘敏 liuminchinese@163.com
Laciq dd@qq.com

在写作过程中我遇到过很多困难,工作繁忙,对未来迷茫,生活压力大,缺乏安全感,个人琐事等等。然而有这么多热心的同学、老师、朋友、网友在等着看我的书更新,给我提建议希望我把书改得更完善,这是我坚持写下去的最大的动力。谢谢你们!

最后几句话

和大多数作者一样,最后我要说的是我水平十分有限,没写过 C 编译器和 C 标准库,我不能保证书中的内容全部正确,如有错误欢迎批评指正。遗憾的是很多作者把这句话当成了挡箭牌,当成了自己不必竭尽全力保证内容正确性的借口。写书是一件严肃的事,书中的错误所有人都看得见,白纸黑字赖不掉的。我教过的很多学生都在大学里学过 C 语言,甚至考过二级,但程序写得一塌糊涂,连最基本的概念都搞错了,以前学过的 C 语言教材中的错误在他们脑子里根深蒂固,即使我纠正多次,他们仍然只记得以前学过的错误概念,这种有基础的学生还不如没有任何基础的学生教起来容易。我非常害怕我教给别人的仍然是错的,所以我仔细研究了 C99 之后才敢动笔写书。这本书涵盖的话题比较广泛,我竭尽全力也不足以保证书中的内容全部正确,还要依靠社区的力量一起来完善这本书,这样才能真正对读者负责,所以我选择将这本书开源。

希望本书成为你求学道路上的第一个伙伴。

宋劲杉 北京 2008年11月27日