基础篇
第1章绪论
本章导读
C语言是目前使用较多的程序设计语言之一。本章将由对C语言的基本应用情况、
发展历史的介绍开始,并简要描述其主要特点,进而通过一个简单的程序案例说明C程序的主要结构、组成及源程序的处理过程,同时也对C程序设计中涉及的命名规则进行简介。*后通过一个具体编程实例介绍以Microsoft Visual C++6.0为运行平台的C程序编辑和运行过程。目的是使读者通过对本章的阅读,能对C语言有初步的了解。
1.1引言
随机进行一个民意调查:您知道或听说过哪些计算机编程语言?得到的答案会是五花八门,C、Pascal、Basic、Fortran、C++、Java.这一系列编程语言的名称,就如同繁星点点,在程序设计的浩瀚天空中散发着璀璨的光芒。而这其中,C语言无疑是被提及*多的*亮的一颗,它就如同北极星,引导着程序设计前进发展的方向。
C语言是使用*广泛的语言之一,可以说,C语言的诞生是现代程序语言革命的起点,是程序设计语言发展史中的一个里程碑。自C语言出现后,以C语言为根基的C++、Java和C#等面向对象语言相继诞生,并在各自领域大获成功。但今天C语言依旧在系统编程、嵌入式编程等领域占据着统治地位。
根据TIOBE编程语言排行榜2014年8月公布的数据,如图1.1~图1.3所示,C语言高居榜首,多年来一直位于选用率榜单前列。
这样一种诞生于20世纪70年代的“古老”编程语言,至今仍为众人所追捧,几乎成为所有编程初学者的入门语言,同时也是很多编程高手的神功利器,焕发着蓬勃的生机。这是为何?
2012年6月30日,O'Reilly②采访了Head First C③一书的联合作者David Griffiths,谈论了为什么今天还要学C语言,谈到以下几点:
(1)C语言至今仍然流行的原因是它无处不在,靠近硬件,被用于开发其他语言和操作系统;
(2)通过学习C语言,可从系统级上更好地理解程序的工作原理;
(3)大学应该继续教C语言,它是一种非常重要的基础性语言,要求完全理解整个技术栈;
(4)学会C语言后学生将能更深入地理解计算机。
浅显地来讲,对于一直要使用C语言的人而言,真正掌握C语言,可以帮助他在编程道路上攻城拔寨,所向披靡;对于要编程又不用C语言的人而言,可以通过C语言窥探计算机底层原理,掌握*流行的语法形式,了解基本的程序设计思维;对于不编程的人而言,能通过C语言更好地了解计算机,了解计算思维,并且通过全国计算机等级二级考试;对所有人而言,C语言会让你了解它并爱上它。
现在,有想学习C语言的冲动了吗?那么,就从追溯C语言的历史开始,我们一起进入编程这个神奇的魔法学校,学习C语言这种*有力的魔咒,成为*强的魔法师!
1.2C语言出现的历史背景
1.2.1C语言的诞生
谈及C语言的诞生,不能不介绍这两位公认的重量级编程高手,“骨灰级”游戏玩家,黑客的鼻祖:Ken Thompson(简称Ken,图1.4)和Dennis M.Ritchie(简称DMR,图1.5)。
20世纪60年代后期,处于计算机史前时代的计算机系统还是批处理一统天下,但其极低的工作效率无法满足时代发展的需求,于是贝尔实验室、麻省理工学院、通用电气公司联合开发一个多用户分时操作系统,取名为Multics(多路信息计算系统),当时作为贝尔实验室成员之一的Ken参与了该项目的开发。在该项目的开发过程中,Ken创造出了名为Bon的编程语言。同时,作为一个游戏玩家,他一直梦想着能傲游太空,于是基于Multics,Ken自己编写了一个叫做“star travel”的游戏。但令Ken始料未及的是,由于开发周期长,成本高,而且庞大缓慢,Multics市场前景完全不被看好,贝尔实验室撤出了该项目。这意味着Ken没有机器可以再玩“star travel”了。
为了满足玩游戏的需要,Ken决定自给自足,在一台废弃已久的老式PDP-7小型机上重写他的游戏,因为这台机器是免费的。但*直接的问题就是:这台PDP-7上没有操作系统!逢山开路,遇水搭桥,Ken勇往直前,用一个月的时间,利用PDP-7上的汇编语言,开发出了一个全新的操作系统,将其命名为UNiplexed Information and Computing System,缩写为UNICS。用汇编编写操作系统不方便,Ken便开发出一种简洁明了且接近于硬件语言的新语言,即C语言的前身一B语言,并用其改写了UNICS,即产生了第一版的UNIX。
UNIX的出现开始并不被看好,但却引起了贝尔实验室另一位同事的注意,这就是同样酷爱“star travel”的Dennis M.Ritchie,于是DMR主动加入共同完善这个系统。自1972年UNIX成功移植到当时*先进的大型机PDP-2上,并于1973年在IBM举办的研讨会上展示后,其简洁、稳定与高效的优秀性能表现立刻引起了轰动,得到大家的喜爱,需求量与日俱增。
UNIX的原码中不少是用汇编完成的,不具备良好的移植性。为了可以移植到各种不同的硬件系统,Ken与DMR决定进一步改写UNIX。1973年,DMR在B语言的基础上开发出了C语言。C语言灵活,高效性,与硬件无关,并且不失其简洁性,正是UNIX移植所需要的法宝,于是旧版的UNIX与C语言完美结合在一起产生了新的可移植的UNIX系统。UNIX和C语言在发展过程中相辅相成,随着UNIX的广泛使用,C语言也成为了当时*受欢迎的编程语言一直延续至今。
由于UNIX与C语言的深远影响,1983年美国计算机协会将当年的图灵奖破例颁给了软件工程师Ken与DMR,并在当年还决定新设立一个奖项一软件系统奖,以奖励那些优秀的软件开发者,当然首*软件系统奖也是非他们两人莫属了。1999年两人因发展C语言和UNIX操作系统的杰出贡献一起获得了美国国家技术奖章。
1.2.2 C语言标准的演变
1.K&RC
为了使UNIX操作系统推广,1977年DMR发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》,即是著名的PCC(Portable C Compiler,可移植C编译器)。1978年,BrainW.Kernighan(简称BWK)和DMR(两人合称K&R)合著TheCProgramming Language。该书被誉为C语言的“圣经”,其中介绍的C语言被称为“标准C”,人们通常称
这个版本的C语言为K&RC,是后来广泛使用的C语言的基础。即使在后来ANSIC标准被提出的许多年后,K&RC仍然是许多编译器的*低标准要求,许多老旧的编译系统仍然运行K&RC的标准。
2.ANSIC/C89标准
20世纪70~80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。1983年美国国家标准局(American National Standards Institute,ANSI)成立了一个委员会,来制定C语言标准。
1989年C语言标准被批准,被称为ANSIX3.159—1989“Programming LanguageC”,简称ANSIC或C89标准。
1990 年,国际标准化组织(International Organization for Standards,ISO)接受了1989年的ANSIC为ISOC的标准,命名为ISO/IEC9899:1990,简称C90标准。不过习惯上仍然叫C89标准。
1994年,ISO修订了C语言的标准。
1995年,ISO对C90做了一些修订,即“1995基准增补1(ISO/IEC/9899/AMD1:1995)”。在ANSI标准化后,尽管C语言继续在改进,但C语言的标准在一段相当的时间内都保持不变。
3.C99标准
在ANSI的标准确立后,C语言的规范在一段时间内没有大的变动,然而C++在自己的标准化创建过程中继续发展壮大。《标准修正案一》在1994年为C语言创建了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。不过,这个标准引出了1999年ISO9899:1999的发表,它通常被称为C99。C99被ANSI于2000年3月采用。
但是各个公司对C99的支持所表现出来的兴趣不同。当GCC和其他一些商业编译器支持C99的大部分特性的时候,微软和Borland却似乎对此不感兴趣。
4.C11标准
2011年12月8日,ISO正式发布了新的C语言的新标准C11,之前被称为C1X,官方名称为ISO/IEC9899:2011。新的标准提高了对C++的兼容性,并增加了一些新的特性。
1.3C语言的特点
1.3.1基本特性
(1)低级的高级语言。从C语言的处理方式来看,它属于高级语言,但从性能和控制来看,它将高级语言的基本结构和语句与低级语言的实用性相结合,相比较其他的编程语言(像C++,Java)而言,更接近低级语言。从总体上来说,可将C语言视为介于汇编语言和高级语言之间的一种语言。而低级的编程语言可以更好地了解计算机。
(2)结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,它本身只提供必要的语言特性。这些函数不是作为C语言核心出现,可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
(3)功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。
(4)C语言兼容性、可移植性强,应用广。C语言对编写所需的硬件环境兼容性优于其他高级语言,适用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。在ANSIC制订后,只要特定平台上的编译器完整实现了C89标准,而且代码没有使用某些特殊的扩展(GCC以及微软都有自己的编译器特定扩展),那么代码一定可以编译通过,再实现一下操作系统相关的函数库,C语言的移植就是很简单的事情,“一次编写,处处编译”。
C语言也是一个比较少见的应用领域极为广泛的语言。很多大型软件都是用C语言编写的,比如编写操作系统。C语言可以编写服务器端软件,如Apache、Nginx,或者编写GUI程序,如GTK。大多数程序语言的第一版是通过C语言实现的,借助前面提到的“一次编写处处编译”,也*大程度保证了这些程序语言的可移植性。
(5)指针。可以直接进行靠近硬件的操作,但是C的指针操作不作保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,由于这些改进增加了语言的复杂度,也为另一部分用户所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。
(6)C语言文件由数据序列组成,可以构成二进制文件或文本文件。
1.3.2优点
(1)简洁紧凑、灵活方便。C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。
C语言相比C++的优点之一就是*小原则,不会在编译时自作主张地自动产生一些额外代码。对于编写操作系统这类性能优化要求较高的系统时,这些多余的代码是不应该出现的。C语言的简洁设计哲学
展开