
1.1 C语言的发展
C语言是国际上广泛流行的计算机高级语言,既可以用来编写系统软件,也可以用来编写应用软件。由于C语言强大的功能及其接近低级语言的效率,尽管面向对象语言的应用已十分广泛,C语言在计算机程序设计领域中仍发挥着重要的作用。
C语言可以称为是程序员的“母语”,它影响和衍生了诸多程序设计语言,比如C++、Java、PHP、JavaScript、Perl、C#、D、Objective-C、Swift等。
我们知道,汇编语言是用符号表示二进制指令的语言,由于汇编语言依赖计算机的硬件,是机器语言的一种助记符,因而与机器语言没有本质的区别,所以很多时候,我们把二者等同视之。用汇编语言编写程序,很难编写大型的程序,并且程序的可读性和可移植性都比较差。早期的操作系统像UNIX等,主要是用汇编语言编写的。为了提高可读性和可移植性,最好使用高级语言编写,但是一般的高级语言却难以实现汇编语言的某些功能,比如可以直接对硬件进行操作等。在这种背景下,一种既具有高级语言的优点,又具有低级语言的特性,集二者优点于一身的语言诞生了,它就是C语言。
1972年,贝尔实验室的D.M.Ritchie(丹尼期·里奇)(如图1-1所示)在BCPL语言和B语言的基础上设计出了C语言,并且应用在UNIX操作系统上。随着UNIX操作系统的推广应用,C语言迅速风靡全世界。

图1-1 里奇
追本溯源,在1963年,剑桥大学在ALGOL 60语言的基础上创造出CPL语言,因此可以说C语言最早的原型就是ALGOL 60语言。
1967年,剑桥大学的Martin Richards(马丁·理察德)对CPL语言进行了简化,于是产生了BCPL语言。
1970年,美国贝尔实验室的Ken Thompson(肯·汤姆逊)对BCPL语言加以改进,并命名为“B语言”。随后,Ken Thompson用B语言编写了第一个UNIX操作系统。
1972年,同为美国贝尔实验室的D.M.Ritchie在B语言的基础上又设计出了一种全新的语言,他取BCPL的第二个字母作为这种语言的名字,这就是C语言。至此,C语言正式诞生了。
C语言诞生之初,Ken Thompson刚刚使用汇编语言和B语言开发出了UNIX操作系统,但用汇编语言开发系统非常烦琐,移植性也不好。于是D.M.Ritchie又用C语言改写了UNIX操作系统。
1978年,C语言的创始人D.M.Ritchie和Brian W.Kernighan(布莱恩·科尔尼干)合著了著名的The C Programming Language一书,该书是世界上第一个C语言标准。这本书被C语言开发者们称为“K&R”,很多年来被当作C语言的非正式标准说明。人们称这个版本的C语言为“K&RC”。同年,美国贝尔实验室正式发布C语言。
二十世纪七八十年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。为了统一C语言版本,1989年,美国国家标准化协会(ANSI)根据C语言问世以来各种版本对C语言的发展和扩充,制定了第一个C语言标准草案(ANSI C)。ANSI C相较原来的C语言标准有了很大的发展。同时,D.M.Ritchie和Brian W.Kernighan也重新修订了他们的经典著作The C Programming Language,按照ANSI C的新标准重新写了该书。
1989年,ANSI C公布了一个完整的C语言标准:ANSI C X3.159-1989,这一标准被正式称为“ANSI C”或者“C89”,是最成熟、流传最广泛的一个标准。直到今天,它仍然被广大C语言爱好者和使用者拥戴。
1990年,国际标准化组织(ISO)接受“C89”作为国际标准ISO/IEC9899:1990。它和“ANSI C”的“C89”基本上是相同的。
1995年,ISO对“C90”做了一些修订,1999年,ISO又对C语言标准进行修订,在基本保留原来的C语言特征的基础上,针对应用的需要,增加了一些功能。这个标准被称为“C99”,从内容上它和ANSI C基本相同,但有一些扩展。但从实际应用情况来看,多数人似乎并不接受它。
2001年和2004年ISO又两次修订C语言的标准,发布了2001年的“TC1”和2004年的“TC2”,但影响甚微。
现在流行最广泛的就是ANSI C标准,本书就是遵循ANSI C标准来进行讲解的。
应该注意到,不同的C语言编译系统,依据的C语言标准不同。一些编译系统是依赖“C89”标准为基础开发的,并未完全实现“C99”标准的功能。初学者在实际应用中,要注意所使用编译系统能够支持的C标准的版本特性。现在比较常见的Visual C++、GCC等编译系统,完全可以支持“C89”“C99”标准的功能。