
第0章 学习攻略
在学习任何一门编程语言之前,都应该对这门语言的用途和应用领域有一个比较清楚的认识。只有这样,才能有目的、有方向地去学习。
本章要点(已掌握的在方框中打钩)
□C语言的起源及特点
□C语言的用途
□C语言的学习方法
0.1 编程的魔力
提到计算机编程,大家第一反应就是,烦琐的代码和复杂的指令。实际上,编程是一件神奇的、具有魔力的事情。
首先不妨看下2147 483 647这个数字,2147 483 647仅可以被1及其本身整除,因此也被称为质数(素数)。它在1772年被欧拉发现,在当时堪称世界上已知的最大的质数,由于证明过程复杂,欧拉也就被冠以“数学英雄”的美名。但是,现在通过简单的程序,不到1秒就可以证明2147 483 647是质数。
下面我们再来看一下八皇后问题。八皇后问题是一个古老而著名的数学问题,该问题是国际象棋棋手马克斯·贝瑟尔于1848年提出的。在8×8格的国际象棋上摆放8个“皇后”,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?

上图所示的就是其中的一种摆法,但是有没有其他方案呢?一共有92种摆法,想知道通过程序多久能计算出来吗?可以告诉你,不到1秒就可以。
相信很多读者都玩过“数独”这个经典的数字游戏(如果没有玩过这个游戏,不妨在网上先了解一下游戏的背景和规则),题目很多,而每一个题目都会对应很多种解法,有的甚至会有几万种。如果想在纸上解出所有方法,是很难实现的,但是通过程序,只需1秒,甚至不到1秒,就可以轻松计算出有多少种解法。
除了上面提到的问题外,还有猴子选大王、迷宫求解、商人过河、哥德巴赫猜想及选美比赛等很多趣味问题。读者既可以了解每个问题背后有趣的故事,又可以自己动手编程获得问题的解决方法;既能开阔眼界,又能学习知识。这也算是编程的特殊魔力吧!
0.2 C语言的起源及特点
C语言是一种计算机程序设计语言,它既有高级语言的特点,又有低级语言的特点。它可以作为系统设计语言来编写系统软件,如MySQL、Windows操作系统等软件的内核都是用C语言编写的;也可以作为应用程序设计语言来编写不依赖计算机硬件的应用软件,很多经典小游戏就是用C语言编写的。因此,它的应用范围非常广泛。下面就来了解一下C语言的起源及特点。
01 C语言的起源
C语言的诞生及发展历程如图所示。

(1)第1阶段:A语言。
C语言的发展颇为有趣,它的原型是ALGOL 60语言(也就是算法语言60),也称A语言。ALGOL 60是一种面向问题的高级语言,它“离硬件比较远”,不适合用于编写系统程序。ALGOL 60是程序设计语言“由技艺转向科学”的重要标志,具有局部性、动态性、递归性和严谨性等特点。
(2)第2阶段:CPL语言。
1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language),CPL在ALGOL 60的基础上与硬件接近了一些,但规模仍然比较宏大,难以实现。
(3)第3阶段:BCPL语言。
1967年,剑桥大学马丁·理查兹对CPL进行了简化,推出了BCPL(Basic Combined Programming Language)。BCPL是计算机软件人员在开发系统软件时作为记述语言使用的一种结构化程序设计语言,它能够直接处理与计算机本身数据类型相近的数据,具有与内存地址对应的指针处理方式。
(4)第4阶段:B语言。
在20世纪70年代初期,美国贝尔实验室的肯·汤普森对BCPL进行了修改,设计出比较简单而且“很接近硬件”的语言,取名为B语言。B语言还包括了汤普森的一些个人偏好,比如在一些特定的程序中减少非空格字符的数量。和BCPL以及FORTH类似,B语言只有一种数据类型——计算机字。大部分的操作将其作为整数对待,例如进行+、-、*、/操作;但进行其余的操作时,则将其作为一个复引用的内存地址。在许多方面,B语言更像是一种早期版本的C语言,它还包括了一些库函数,其作用类似于C语言中的标准输入/输出函数库。
(5)第5阶段:C语言。
由于B语言过于简单,数据没有类型,功能也有限,所以美国贝尔实验室的丹尼斯·M·里奇在B语言的基础上设计出了一种新的语言,取名为C语言,并试着以C语言编写UNIX操作系统。1972年,丹尼斯·M·里奇完成了C语言的设计,并成功地利用C语言编写出了操作系统,从而降低了操作系统的修改难度。
1978年,C语言先后被移植到大、中、小、微型计算机上,风靡世界,成为应用最广泛的几种计算机语言之一。
1989年,美国国家标准协会(American National Standard Institute,ANSI)发布了第一个完整的C语言标准——ANSI X3.159-1989,简称C89,1994年,国际标准化组织(International Organization for Standardization,ISO)修订了C语言的标准。C语言标准C99是在1999年颁布、在2000年3月被ANSI采用的,正式名称是ISO/IEC 9899:1999。
02 C语言的特点
每一种语言都有自己的优缺点,C语言也不例外,所以才有了语言的更替,有了不同语言的使用范围。下面列举C语言的一些特点。
(1)功能强大、适用范围广、可移植性好。
许多著名的系统软件都是由C语言编写的,而且C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机的基本工作单元。
C语言适合于多种操作系统,如DOS、Windows、UNIX等。对于操作系统以及需要对硬件进行操作的场合,使用C语言明显优于使用其他解释型高级语言。
(2)运算符丰富。
C语言的运算符包含的范围广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样。灵活地使用各种运算符可以实现在其他高级语言中难以实现的运算。
(3)数据结构丰富。
C语言的数据类型有整型、实型、字符型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据结构的运算。C语言还引入了指针的概念,从而使程序的效率更高。
(4)C语言是结构化语言。
结构化语言的显著特点是代码和数据的分隔化,即程序的各个部分除了必要的信息交换外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,因此用户可以方便地调用这些函数,通过多种循环和条件语句来控制程序的流向,从而使程序结构化。
(5)C语言可以进行底层开发。
C语言允许直接访问物理地址,可以直接对硬件进行操作,因此可以使用C语言来进行计算机软件的底层开发。
(6)其他特点。
C语言对语法的限制不太严格,其语法比较灵活,程序编写者有较大的自由度。另外,C语言生成的目标代码质量高,程序执行效率高。
0.3 C语言的用途
C语言应用范围极为广泛,不仅仅是在软件开发上,各类科研项目也都要用到C语言。下面列举了C语言一些常见的用途。
(1)应用软件。Linux操作系统中的应用软件有许多是用C语言编写的,这样的应用软件安全性非常高。
(2)对性能要求严格的领域。许多对性能有严格要求的程序都是用C语言编写的,比如网络程序的底层、网络服务器端的底层和地图查询等软件。
(3)系统软件和图形处理。C语言具有很强的绘图能力、数据处理能力和可移植性,可以用来编写系统软件、制作动画、绘制二维图形和三维图形等。
(4)数字计算。与其他编程语言相比,C语言是数字计算能力较强的高级语言。
(5)嵌入式开发。手机、个人数字助理(又称掌上电脑)等电子产品内部的应用软件、游戏等很多都是采用C语言进行嵌入式开发的。
(6)游戏软件开发。利用C语言可以开发很多游戏,例如推箱子、贪吃蛇等。
0.4 C语言实现的人机交互
计算机是用来帮助人类改变生活的工具,如果希望计算机帮助你做事情,首先需要做什么?当然是与计算机进行沟通,那么沟通就需要一门语言。人与人之间可以用肢体动作、语言进行沟通,而如果要与计算机沟通,就需要使用计算机能够“听懂”的语言。其中,C语言便是人类与计算机沟通的一种语言。
既然计算机是人类制造出来的、帮助人类的工具,显然让计算机“开口说话”、把计算机所知道的东西告诉人类是非常重要的。那么,首先就来看一下如何让计算机开口说话。
计算机要把它所知道的告诉人类,有很多方法,比如可以显示在显示器上,可以通过音箱等设备发出声音等。如果用屏幕输出,这里就需要一个让计算机开口说话的命令printf。
printf("ni hao");
printf和中文里面的“说”、英文里面的“say”是一个意思,就是控制计算机说话的一个单词。在printf后面紧跟一对圆括号(),把要说的内容放在这个括号里。在ni hao的两边还有一对双引号"",双引号里面的就是计算机要说的内容。最后,还需要用分号“;”表示语句的结束。
但在编写程序的过程中,仅仅包含printf("ni hao");这样的语句,计算机是识别不了的,还需要加一个框架。
#include <stdio.h> #include <stdlib.h> int main() { printf("ni hao"); return 0; }
用{和}括起来的部分,通常表示程序某一层次的结构。
所有C语言程序都必须有框架,并且类似printf这样的语句都要写在这一对花括号{}之间才有效。
除了与计算机交流的这些“命令”外,还需要有“C语言编译器”这样一个特殊软件,其作用是把代码变成一个可以让计算机直接运行的程序。这些软件需要下载并安装到计算机中才能使用。
当然,不同的编程语言,让计算机“说话”的方式不同,这些就等着大家去学习。或许通过大家的努力,将来让计算机通过人类语言与人类交流也能够轻松实现。
0.5 C语言的学习方法
C语言是在国内外广泛使用的一种计算机语言,很多新型的语言,如C++、Java、C#、J#、Perl等都衍生自C语言。掌握了C语言,可以说就相当于掌握了很多门语言。
在编写一个较大的程序时,应该把它分成几个小程序,这样会容易得多。同时,学习C语言时应该操作和理论相结合,两者是不可分割的。
读者要学习C语言,首先要注意以下几个方面。
(1)要培养学习C语言的兴趣。从简单的引导开始,有了学习的兴趣,才能够真正掌握C语言。此外,还要养成良好的学习习惯,切忌“逼迫学习”,把学习当成负担。
(2)学习语法。可以通过简单的实例来学习语法,了解它的结构。如变量,首先要了解变量的定义方式(格式),其意义是什么(定义变量有什么用);其次要学习怎么去运用它(用什么形式去应用它)。这些都是语法基础,也是C语言的基础,如果把它们都了解了,那么编写程序就得心应手了。
(3)学好语法后就可以开始编程了。在编写程序的时候,应该养成先画算法流程图的良好习惯。因为C语言的程序结构是模块化的,按照顺序一步步地从上往下执行,而流程图的思路也是从上到下一步步设计出来的。流程图画好了,编程的思路也基本定了,然后只需根据思路来编写程序代码即可。
(4)养成良好的编写习惯。例如,编写程序时每行代码要有缩进,程序复杂时还要写注释,这样程序看起来才会很清晰,错误也会减少很多,便于日后阅读、维护。
学习编程语言就是一个坚持读程序、编写代码、上机调试的过程。
(1)要学好C语言,首先要有一本好的入门书籍。本书把C语言所涉及的内容由易到难进行了详细的讲解,对于读者来说是个不错的选择。
(2)亲手操作。在大概了解内容后,一定要把程序“敲”出来自己运行一遍。编程工具推荐Code::Blocks。
(3)读程序。找一些用C语言编写的程序的例子,试着去读懂。
(4)自己改写程序。通过前面的学习,应该已经掌握了一些基本的编程技巧,在此基础上对程序进行改写。一定要有自己的想法,然后让自己的想法通过程序来实现。编程语言的学习过程就是坚持的过程,只要掌握了一种编程语言,再去学习其他的语言就很轻松了。