1.1 C 语言的特点以及 C 程序的基本组成
1.1.1 C 语言的特点
- 语言简洁、紧凑,使用方便、灵活。C 语言一共只有 37 个关键字(见附录 B)、9 种控制语句,程序书写形式自由,主要用小写字母表示,压缩了一切不必要的成分。C 语言程序比其他许多高级语言简练,源程序短,因此输人程序时工作量少。
实际上,C 是一个很小的内核语言,只包括极少的与硬件有关的成分,C 语言不直接提供输入和输出语句、有关文件操作的语句和动态内存管理的语句等(这些操作是由编译系统所提供的库函数来实现的),C 的编译系统相当简洁。 - 运算符丰富。C语言的运算符包含的范围很广泛,共有 34 种运算符(见附录 C)。C 语言把括号、赋值和强制类型转换等都作为运算符处理,从而使 C 语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。
- 数据类型丰富。C 语言提供的数据类型包括:整型、浮点型、 字符型、数组类型、指针类型、结构体类型和共用体类型等,C99又扩充了复数浮点类型、超长整型(long long)和布尔类型(bool)等。尤其是指针类型数据,使用十分灵活和多样化,能用来实现各种复杂的数据结构(如链表、树、栈等)的运算。
- 具有结构化的控制语句(如 if…else 语句、while 语句、do…while 语句、switch 语句和 for 语句)。用函数作为程序的模块单位,便于实现程序的模块化。C 语言是完全模块化和结构化的语言。
- 语法限制不太严格,程序设计自由度大。例如,对数组下标越界不进行检查,由程序编写者自己保证程序的正确。对变量的类型使用比较灵活,例如,整型量与字符型数据以及逻辑型数据可以通用。一般的高级语言语法检查比较严,能检查出几乎所有的语法错误,而 C 语言允许程序编写者有较大的自由度,因此放宽了语法检查。程序员应当仔细检查程序,保证其正确,而不要过分依赖 C 语言编译程序查错。“限制”与“灵活”是一对矛盾。限制严格,就失去灵活性;而强调灵活,就必然放松限制。对于不熟练的人员,编一个正确的 C 语言程序可能会比编一个其他高级语言程序难一些。也就是说,对用 C 语言的人,要求更高一些。
- C 语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此 C 语言既具有高级语言的功能,又具有低级语言的许多功能,可用来编写系统软件。C 语言的这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言。
- 用 C 语言编写的程序可移植性好。由于 C 的编译系统相当简洁,因此很容易移植到新的系统。而且 C 编译系统在新的系统上运行时,可以直接编译“标准链接库”中的大部分功能,不需要修改源代码,因为标准链接库是用可移植的 C 语言写的。因此,几乎在所有的计算机系统中都可以使用 C语言。
- 生成目标代码质量高,程序执行效率高。
1.1.2 C 程序的基本组成
-
一个程序由一个或多个源程序文件组成。一个规模较小的程序,往往只包括一个源程序文件,如例 1.1 和例 1.2 是一个源程序文件中只有一个函数(main 函数),例 1.3 中有两个函数,属于同一个源程序文件。在一个源程序文件中可以包括 3 个部分:
- 预处理指令。如
# include <stdio. h>
(还有一些其他预处理指令,如# define
等)。C 编译系统在对源程序进行“翻译”以前,先由一个“预处理器”(也称“预处理程序”、“预编译器”)对预处理指令进行预处理,对于#include<stdio.h>
指令来说,就是将stdio.h
头文件的内容读进来,放在# include
指令行,取代了# include <stdio. h>
。由预处理得到的结果与程序其他部分一起,组成一个完整的、可以用来编译的最后的源程序,然后由编译程序对该源程序正式进行编译,才得到目标程序。 - 全局声明。即在函数之外进行的数据声明。例如可以把例 1.2 程序中的
int a,b,sum;
放到 main 函数的前面,这就是全局声明,在函数外面声明的变量称为全局变量。如果是在程序开头(定义函数之前)声明的变量,则在整个源积程序文件范围内有效。在函数中声明的变量是局部变量,只在函数范围内有效。关于全局变量和局部变量的概念和用法见本书第7章。在本章的例题中没有用全局声明,只有在函数中定义的局部变量。 - 函数定义。如例 1.1、例 1.2 和例 1.3 中的 main 函数和例 1.3 中的 max 函数,每个函数用来实现一定的功能。在调用这些函数时,会完成函数定义中指定的功能。
- 预处理指令。如
-
函数是 C 程序的主要组成部分。程序的几乎全部工作都是由各个函数分别完成的,函数是 C 程序的基本单位,在设计良好的程序中,每个函数都用来实现一个或几个特定的功能。编写 C 程序的工作主要就是编写一个个函数。一个 C 语言程序是由一个或多个函数组成的,其中必须包含一个 main 函数(且只能有一个 main 函数)。例 1.1 和例 1.2 中的程序只由一个main 函数组成,例 1.3 程序由一个 main 函数和一个 max 函数组成,它们组成一个源程序文件,在进行编译时对整个源程序文件统一进行编译。
一个小程序只包含一个源程序文件,在一个源程序文件中包含若千个函数(其中有一个 main 函数)。当程序规模较大时,所包含的函数的数量较多,如果把所有的函数都放在同一个源程序文件中,则此文件显得太大,不便于编译和调试。为了便于调试和管理,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若千个函数。一个源程序文件就是一个程序模块,即将一个程序分成若千个程序模块。
在进行编译时是以源程序文件为对象进行的。在分别对各源程序文件进行编译并得到相应的目标程序后,再将这些目标程序连接成为一个统一的二进制的可执行程序。
C 语言的这种特点使得容易实现程序的模块化。
在程序中被调用的函数,可以是系统提供的库函数(例如 printf 和 scanf 函数),也可以是用户根据需要自己编制设计的函数(例如例 1.3 中的 max 函数)。C 的函数库十分丰富,ANSIC 建议提供一百多个标准库函数,不同的 C 编译系统除了提供标准库函数外,还增加了其他一些专门的函数,如 Turbo C 提供三百多个库函数。不同编译系统所提供的库函数个数和功能是不完全相同的。 -
一个函数包括两个部分。
- 函数首部。即函数的第 1 行,包括函数名、函数类型、函数属性、函数参数(形式参数)名、参数类型。
例如,例 1.3 中的 max 函数的首部为
一个函数名后面必须跟一对圆括号,括号内写函数的参数名及其类型。如果函数没有参数,可以在括号中写 void,也可以是空括号,如:int main (void)
或int main()
- 函数体。即函数首部下面的花括号内的部分。如果在一个函数中包括有多层花括号,则最外层的一对花括号是函数体的范围。
- 函数体一般包括以下两部分。
- 声明部分。声明部分包括:定义在本函数中所用到的变量,如例 1.3 中在 main 函数中定义变量
int a,b,c;
;对本函数所调用函数进行声明,如例 1.3 中在 main 函数中对 max 函数的声明int max (int x,int y);
。 - 执行部分。由若千个语句组成,指定在函数中所进行的操作。
- 声明部分。声明部分包括:定义在本函数中所用到的变量,如例 1.3 中在 main 函数中定义变量
- 在某些情况下也可以没有声明部分(例如例 1.1),甚至可以既无声明部分也无执行部分。如:
void dump (){}
它是一个空函数,什么也不做,但这是合法的。
- 函数体一般包括以下两部分。
- 函数首部。即函数的第 1 行,包括函数名、函数类型、函数属性、函数参数(形式参数)名、参数类型。
-
程序总是从 main 函数开始执行的,而不论 main 函数在整个程序中的位置如何(main 函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前、另一些函数之后)。
-
程序中对计算机的操作是由函数中的 C 语句完成的。如赋值、输入输出数据的操作都是由相应的 C 语句实现的。C 程序书写格式是比较自由的。一行内可以写几个语句,一个语句可以分写在多行上,但为清晰起见,习惯上每行只写一个语句。
-
在每个数据声明和语句的最后必须有一个分号。分号是 C 语句的必要组成部分。如
c=a+b;
其中的分号是不可缺少的。 -
C 语言本身不提供输入输出语句。输入和输出的操作是由库函数 scanf 和 printf 等函数来完成的。C 对输人输出实行“函数化”。由于输入输出操作涉及具体的计算机设备,把输入输出操作用库函数实现,就可以使 C 语言本身的规模较小,编译程序简单,很容易在各种机器上实现,程序具有可移植性。
-
程序应当包含注释。一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。
评论(没有评论)