没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Linux C 编程一站式学习
前言 (I. C
语言入门 )
这本书有什么特点?面向什么样的读者?
这本书最初是为北京亚嵌教育研究中心的嵌入式 系统工程师就业班课程量身定做的教材之一。
该课程是为期四个月的全日制职业培训,要求学员毕业时具备非常 的 编程能力,能熟练
地使用 系统,同时对计算机体系结构与指令集、操作系统原理和设备驱动程序都有较深入的
了解。然而学员入学时的水平是非常初级而且参差不齐的:学历有专科、本科也有研究生,专业
有和计算机相关的也有很不相关的(例如会计专业),以前从事的职业有和技术相关的也有完全
不相关的(例如 !),年龄从二十出头到三十五六岁的都有。这么多背景完全不同、基础完全不
同、思维习惯和理解能力完全不同的人来听同一堂课,大家都迫切希望学会嵌入式开发技术,投
身 "# 行业,这就是职业教育的特点,也是我编这本书时需要考虑的主要问题。
学习编程绝不是一件简单的事,尤其是对于零基础的初学者来说。大学的计算机专业有四年时间
从零基础开始培养一个人,微积分、线代、随机、离散、组合、自动机、编译原理、操作系统、计
算机组成原理等等一堆基础课,再加上 $$、%&、数据库、网络、软件工程、计算机图形学
等等一堆专业课,最后培养出一个能找到工作的学生。很遗憾这最后一条很多学校没有做好,来
亚嵌培训的很多学生就是四年这么学过来的,但据我们考查他们的基础几乎为零,我不知道为什么。
与之形成鲜明对比的是,只给我们四个月的时间,同样要求从零基础开始,最后培养出一个能找
到工作的学生,而且还要保证他找到工作,这就是职业教育的特点。
为什么我说“只给我们四个月的时间”呢?我们倒是想教四年呢,但学时的长短我们做不了主,是由
市场规律决定的。四年的任务要求四个月做好,要怎么完成这样一个几乎不可能的任务?有些职业
教育给出的答案是“实用主义”,打出了“有用就学,没有用就不学”的口号,大肆贬低说大学里教的
基础课都是过时的、无用的,只有他们教的技术才是实用的,这种炒作很不好,我认为大学里教的
每一门课都是非常有用的,基础知识在任何时候都不会过时,倒是那些时髦的“实用技术”有可能很
快就过时了。
四年的任务怎么才能用四个月做好?我们给出的答案是“优化”。现在大学里安排的课程体系最大的
缺点就是根本不考虑优化。每个过来人都会有这样的感觉:大一大二学了好多数学课,却不知道都
是干什么用的,为什么要学。连它有什么用都不知道怎么能有兴趣学好呢?然后到大三大四学专
业课时,用到以前的知识了,才发现以前学的数学是多么有用,然而早就忘得一干二净了,考完试
都还给老师了,回头重新学吧,这时候才发现很多东西以前根本没学明白,现在才真的学明白了,
那么前两年的时间岂不是都浪费了?大学里的课程体系还有一个缺点就是不灵活,每门课必须占
一个学期,必须由一个老师教,不同课程的老师之间没有任何沟通和衔接,其实这些课程之间是相
互依赖的,把它们强行拆开是极不符合人的认知规律的。比如我大一的上半学期就被逼着学 语
言,其实 语言是一门很难的编程语言,不懂编译原理、操作系统和计算机体系结构根本不可能学
明白,那半个学期自然就浪费掉了。当时几乎所有学校的计算机相关专业都是这样,大一上来就
学 语言,有的学校更疯狂,上来就学 $$,导致大多数学生的 语言都是半吊子水平,写出来
的都是垃圾代码,为一个 ' 搞得焦头烂额,却没有机会再系统地学一遍 语言,因为在学校看
1
来, 语言课早在大一就给你“上完了”,就像一顿饭已经吃完了,没有理由让你把这顿饭重吃一遍。
显而易见,如果要认真地对这些课程做优化,的确是有很多水份可以挤的。
本书有以下特点:
不是孤立地讲 语言,而是和编译原理、操作系统、计算机体系结构结合起来讲。或者说,
本书的内容只是以 语言为载体,真正讲的是计算机的原理和程序的原理。
充分考虑到概念的前后依赖关系,每次引入一个新的概念,只依赖于前面章节已经讲过的
概念,而绝不会依赖后面章节要讲的概念,读者只需要从前到后阅读即可。有些地方为了
叙述得完整,也会引用后面要讲的内容,比如说“有关 (( 我们到 (( 章再仔细讲解”,凡是
这种引用都可以当它不存在,只管继续往下看就行了。
尽量做到每个知识点直到要用的时候才引入。过早引入一个知识点,讲完了又不用它,读
者很快就会遗忘,这是不符合认知规律的。
这是一本从零基础开始学习编程的书,当然不要求读者有任何编程经验。但至少需要具备以下素质:
熟悉 系统的基本操作。如果不具备这一点,请先参考其它教材学习 系统的基
本操作,熟练之后再学习本书。
具有高中毕业的数学水平。本书会用到高中的数学知识,事实上,如果不具有高中毕业的
数学水平,也可以不必考虑做程序员了。但并不是说只要具有高中毕业的数学水平就足够
做程序员了,只能说看这本书应该没有问题,数学是程序员最重要的修养,计算机科学其
实就是数学的一个分支,如果你的数学功底很差,日后还需恶补一下。
具有高中毕业的英文水平。理由同上。
又是一本 C 语言书。好吧,为什么我要学这本书而不是谭浩强或者
K&R?
谭浩强的书我就不说什么了。居然教学生 ) 一个 文件。
*+!是公认的世界上最经典的 语言教程,这点毫无疑问。在 标准出台之前,*+! 第一版就是
事实上的 标准。,- 标准出台之后,*+! 跟着标准推出了第二版,可惜此后就没有更新过了,
所以不能反映 ,- 之后 语言的发展以及最新的 -- 标准,本书在这方面做了很多补充。上面我
说过了,这本书与其说是讲 语言,不如说是以 语言为载体讲计算机和操作系统的原理,而
*+! 就是为了讲 语言而讲 语言,侧重点不同,内容编排也很不相同。*+! 写得非常好,代码
和语言都非常简洁,但很可惜,只有会 语言的人才懂得欣赏它,*+! 是非常不适合入门学习的,
尤其不适合零基础的学生入门学习。
这本书“是什么”和“不是什么”
本书包括三大部分:
2
语言入门。介绍基本的 语法,帮助没有任何编程经验的读者理解什么是程序,怎么写
程序,培养程序员的思维习惯,找到编程的感觉。前半部分改编自.#/。
语言本质。结合计算机和操作系统的原理讲解 程序是怎么编译、链接、运行的,同时
全面介绍 的语法。位运算的章节改编自亚嵌教育林小竹老师的讲义。汇编语言的章节改
编自.01/,在这本书的最后一章提到,学习编程有两种 2,一种是
'1,一种是 #3,各有优缺点,需要两者结合起来。所以我编这本书的思
路是,第一部分 #3,第二部分 '1,第三部分可以算填了中间的空隙,三
部分全都围绕 语言展开。
系统编程。介绍各种 系统函数和内核的工作原理。) 编程的章节改编自
亚嵌教育卫剑钒老师的讲义。
这本书定位在入门级,虽然内容很多,但不是一本百科全书,除了 语言基本要讲透之外其它内
容都不深入,书中列出了很多参考资料,是读者进一步学习的起点。*+! 的第一章是一个
4#,把全书的内容简单过了一遍,然后再逐个深入进去讲解。本书也可以看作是计
算机专业课程体系的一个 4#,学习完本书之后有了一个全局观,再去学习那些参考
资料就应该很容易上手了。
为什么要在 Linux 平台上学 C 语言?用 Windows 学 C 语言不好吗?
用4 还真的是学不好 语言。 语言是一种面向底层的编程语言,要写好 程序,必须对
操作系统的工作原理非常清楚,因为操作系统也是用 写的,我们用 写应用程序直接使用操作
系统提供的接口。既然你选择了看这本书,你一定了解: 是一种开源的操作系统,你有任何
疑问都可以从源代码和文档中找到答案,即使你看不懂源代码,也找不到文档,也很容易找个高
手教你,各种邮件列表、新闻组和论坛上从来都不缺乐于助人的高手;而 4 是一种封闭的
操作系统,除了微软的员工别人都看不到它的源代码,只能通过文档去猜测它的工作原理,更糟糕
的是,微软向来喜欢藏着揶着,好用的功能留着自己用,而不会写到文档里公开。本书的第一部
分在 或 4 平台上学习都可以,但第二部分和第三部分介绍了很多 操作系统的
原理以帮助读者更深入地理解 语言,只能在 平台上学习。
4 平台上的开发工具往往和各种集成开发环境("35,"))3)&))
5&))绑在一起,例如 6、5) 等。使用 "35 确实很便捷,但 "35 对
于初学者绝对不是好东西。微软喜欢宣扬傻瓜式编程的理念,告诉你用鼠标拖几个控件,然后点
一个按钮就可以编译出程序来,但是真正有用的程序有哪个是这么拖出来的?很多从 4 平
台入门学编程的人,编了好几年程序,还是只知道编完程序点一个按钮就可以跑了,把几个源文
件拖到一个项目里就可以编译到一起了,如果有更复杂的需求他们就傻眼了,因为他们脑子里只有
按钮、菜单的概念,根本没有编译器、链接器、7)8) 的概念,甚至连命令行都没用过,然而
这些都是初学编程就应该建立起来的基本概念。另一方面,编译器、链接器和 语言的语法有密
切的关系,不了解编译器、链接器的工作原理,也不可能真正掌握 的语法。所以,"35 并没有帮
助你学习,而是阻碍了你学习,本来要学好 编程只要把语法和编译命令学会就行了,现在有了
"35,除了学会语法和编译命令,你还得弄清楚编译命令和 "35 是怎么集成的,这才算学明白了,
本来就很复杂的学习任务被 "35 搞得更加复杂了。 用户的使用习惯从来都是以敲命令为主,
以鼠标操作为辅,从学编程的第一天起就要敲命令编译程序,等到你把这些基本概念都搞清楚了,
你觉得哪个 "35 好用你再去用,不过到那时候你可能会更喜欢 & 或 ) 而不是 "35 了。
3
致谢
本书的写作得到北京亚嵌教育研究中心的全力支持,尤其感谢李明老师和何家胜老师,没有公司的
支持,我不可能有时间有条件写这本书,也不可能有机会将这本书公开在网上。
然后要感谢亚嵌教育的历届学员和各位老师,在教学和讨论过程中我经常会得到有益的启发,这些
都促使这本书更加完善。在本书写作过程中,很多读者为本书提出很有价值的建议,很多建议是通
过网友的在线评论得到的,我只知道 或 )。都列在下面,排名不分先后。
感谢北京亚嵌教育研究中心的老师们:李明,何家胜,邸海霞,郎铁山,朱仲涛,廖文江,韩超,
吴岳,邢文鹏,何晓龙,林小竹,卫剑钒。
感谢热心网友:
(9:)),)();9<=),(9
),田伟()9>>),田雨(;=9
),(<;,9),邓楠(9),杜朴风
(9>>),?@)(>A)9),陈老师
(B)9),杨景(B9),章钰
(>9<=),)(;==9),B>(B
>9),%)
?(>9),)();C9)。
第1章程序的基本概念
程序和编程语言
程序(D)是一个精确说明如何进行计算的指令序列。这里的计算可以是一些数学上的计
算,比如解方程或者求多项式的根,也可以是符号运算,一个简单的例子是查找和替换文档中的
词,一个复杂的例子是搜索引擎。从根本上说,计算机是由数字电路组成的运算机器,只能对数字
做运算,程序之所以能做符号运算是因为符号在计算机内部也是用数字来表示的。此外,程序还
可以处理声音和图像,同样因为声音和图像在计算机内部是用数字来表示的,这些数字再通过专门
的硬件设备转换成人可以听到、看到的声音和图像。
程序由一系列指令(")组成,指令是指示计算机做某种运算的命令,通常包括以下几
类:
输入(Input)
从键盘、文件或者其它设备获取数据。
输出(Output)
把数据显示到屏幕,或者存入一个文件,或者发送到其它设备。
4
基本运算
执行最基本的数学运算(加减乘除)和数据存取,其实输入和输出也属于数据存取。
测试和分支(Branch)
测试某个条件,然后根据不同的测试结果执行不同的后续指令。
循环(Loop)
重复执行一系列操作。
对于程序来说,有上面这几类指令就足够了。你曾用过的任何一个程序,不管它有多么复杂,都是
由上面这几类指令组成的。程序是那么的复杂,而编写程序可以用的指令却只有这么简单的几种,
这中间巨大的落差就要由程序员去填了,所以编写程序理应是一件相当复杂的工作。
编写程序可以
说就是这样一个过程:把复杂的任务分解成子任务,把子任务再分解成更简单的任务,层层分解,
直到最后简单得可以用以上指令来完成。
在不同的编程语言(D))中,以上几种指令具有不同的形式。通常“指令”
这个词专指机器语言(7)))或者汇编语言(2)))等低级语
言(E)&)))中的指令,而在 语言、$$、%&、D 等高级语言( E
)&)))中通常称为语句()))或表达式(5))
./
。举个例子,同样
一个语句用 语言、汇编语言和机器语言表示如下:
表1.1.同一个语句的三种表示
C 语言 a=b+1;
汇编语言
&FFFFEGH)IJ
H)
FFFFKJH)
&FFFFH)JE
,GH)I
机器语言
,FLCF:L
,=FF
,-FLCF:,
计算机只能对数字做运算,虽然高级语言中有大量的符号,但这些符号都是人为定义的,最终转换
成计算机可以直接处理的机器语言仍然是数字,上表中的机器语言完全由十六进制数字组成。最
早的程序员都是直接用机器语言编程,但是很麻烦,需要查大量的表格来确定每个数字表示什么意
思,编写出来的程序很不直观,很容易出错,于是有了汇编语言,把机器语言中的一组一组数字
用助记符(7))来表示,直接用这些助记符写出汇编程序,然后让汇编器
(2)))去查表把助记符替换成数字,也就把汇编语言翻译成了机器语言。从上面的例子
可以看出,汇编语言和机器语言的指令是一一对应的,汇编语言有三条指令机器语言也有三条指令,
5
剩余63页未读,继续阅读
Samrv.W
- 粉丝: 15
- 资源: 43
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0