1.1 C语言概述
C语言是一种高级程序设计语言,是20世纪70年代由Dennis Ritchie和Brian Kernighan在贝尔实验室开发的。虽然C语言最初是作为一种系统语言设计的,但后来的实践证明C语言功能强大,也十分灵活,可以用于各种应用程序,如商业软件、工程项目等。C语言在个人计算机编程领域非常流行,因为它规模较小——比其他语言需求的内存少。
用C语言编写的第一个重要程序是UNIX操作系统;以后多年中,大家普遍认为C语言是与UNIX操作系统密不可分的。不过,现在C语言已经是一种与UNIX无关的重要语言,虽然C语言是一种高级语言,但是它比其他高级语言更接近汇编语言,正是因为它与机器语言十分接近,C程序员才可以编写高效率的代码。不过,C语言的这种低级别性在某些应用场合也显得难以驾驭。
以下我们将从历史和技术的角度对C语言做一个概括。
作为一种通用的程序设计语言,C语言是在UNIX环境下开发出来的,UNIX系统本身及其应用程序也都是用C语言编写的,所以C语言一直与UNIX有着密切的关系。不过,C语言并不局限于某种操作系统或者机型;C语言一直被称为一种“系统开发语言”,因为它在编写编译程序和操作系统方面特别有用,但是,它在其他领域的大型程序开发方面也表现得同样出色。
C语言的许多重要思想来自于Martin Richards研制的BCPL语言。BCPL语言对于C语言的影响是通过B语言间接地进行的。B语言是Ken Tompson于1970年为DEC-PDP-7计算机上的UNIX系统设计开发的。BCPL语言和B语言都是无类型的语言,相比之下,C语言提供了各种数据类型。其中基本的数据类型包括字符型、整数型、各种精度的浮点型、数组型、结构型及联合体。表达式是由操作数组成的;任何表达式,包括赋值及函数调用都可以作为一条语句。指针则可以提供与机器无关的地址运算。
C语言提供了各种基本的流控制结构,用于结构化程序设计,如语句分组、判定结构(if…else)、分支结构(switch)、循环结构(while、for)及循环中断命令(break)。函数的返回值可以是基本类型、结构、共同体或指针。任何函数均可以递归调用。通常局部变量都是自动类型或者说是每次调用时重新建立的。函数定义不能嵌套,但是变量可以在块结构中说明。C程序的函数单独存放于源文件中,分别编译。变量可定义为函数的内部变量、某一源文件中可以使用的外部变量,也可以定义为整个程序可见的全程变量。
预处理功能可以对程序文本进行宏替换,并可以蕴含其他源文件,或者进行条件编译。C语言是一种相对低级的语言,也就是说它可以处理大多数机器本身所能处理的数据类型,如字符、数值、地址等。这些数据既可以同机器所支持的算术和六级运算符组合,也可以由它们进行传递。对以字符串、集合、表、数组等组合数据类,C语言没有提供直接的操作。虽然一个结构可以整体复制,但是C语言中无法对整个数组或字符串进行整体操作。除了函数内的局部变量可以进行静态定义和堆栈无用内存收集机制。C语言本身也没有提供输入/输出功能,没有读写语句及内在的文件存取方法。所有的这些高层的机制都是通过函数显式调用的,大多数的C语言版本都带有标准的函数库。基于同样的道理,C语言仅仅提供了直接的、单线程的流程控制,如测试、循环、分支及子程序等;没有多道程序控制、并行操作、同步、协同例程管理。没有上述功能看起来是一种缺陷,不过,把语言控制在较小的规模有许多优点。鉴于C语言相对较小,可以用比较少的篇幅予以描述,并可以在较短时间内掌握。
1983年,美国国家标准协会(ANSI)成立了一个专门的委员会,对C语言进行全面的、现代化的定义。其结果便是ANSI C,是1988年完成的,这一标准的大多数功能在较新的编译系统中已经得以实现。这一标准是基于早期的C语言参考手册建立的,相对而言,语言本身没有多少变化;其目的之一就是为了保证大多数程序可以有效运行,或者,在不兼容的情况下,由编译程序提出警告,说明程序可能导致的新的操作。对于大多数程序员来说,最重要的变化是函数的说明及定义有了一种新的语法,现在,在函数的说明中可以包含参数的描述;函数的定义语法也做了相应的修改,有了这种附件信息,编译程序就可以很容易地检查出参数类型不匹配所造成的错误。事实证明,对C语言的这一扩充非常有效。
ANSI C对C语言的第二个贡献是定义了一套伴随C语言的函数库,其中说明函数涉及操作系统的访问、格式化输入/输出、内存分配、字符串操作等。ANSI C还规定了一套头文件,提供了对函数说明及数据类型的统一使用方法。程序只要使用这一函数库与机器交换信息,其兼容性就可以得到保证,大多数的库函数都是以UNIX系统的标准I/O函数库为基础建立的。虽然C语言可以充分发挥多数计算机的功能,但是,它并不依赖于具体的计算机体系结构,只需稍加注意,就可以编写出可移植的程序,也就是说程序不用修改就可以在各种机器上运行。
像其他语言一样,C语言也有自己的缺陷。比如,某些运算的优先顺序存在错误、语句在语法上可以更好一些等,尽管如此,实践证明语言在各种编程运用中非常有效,并具有良好的表现力。