本书是由C语言的设计者Brian W. Kernighan和Dennis M. Ritchie编写的一部介绍标准C语言及其程序设计方法的权威性经典著作。全面、系统地讲述了C语言的各个特性及程序设计的基本方法,包括基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口、标准库等内容。\r\n 本书的讲述深入浅出,配合典型例证,通俗易懂,实用性强,适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。 在计算机发展的历史上,没有哪一种程序设计语言像C语言这样应用如此广泛。\r\n 本书原著 即为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的 一本介绍C语言的权威经典著作。我们现在见到的大量论述C语言程序设计的教材和专著均以 此书为蓝本。原著第1版中介绍的C语言成为后来广泛使用的C语言版本—— 标准C的基础。人们熟知的“hell, World”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设 计语言入门的第一课。 原著第2版根据1987年制定的ANSIC标准做了适当的修订.引入了最新的语言形式,并增加了新的示例,通过简洁的描述、典型的示例,作者全面、系统、准确地讲述了C语言的各 个特性以及程序设计的基本方法。对于计算机从业人员来说,本书是一本必读的程序设计语 言方面的参考书。
出版者的话\r\n专家指导委员会\r\n中文版序\r\n译者序\r\n校译者简介\r\n序\r\n第1版序\r\n引言\r\n第1章 导言\r\n 1.1 入门\r\n 1.2 变量与算术表态式\r\n 1.3 for语句\r\n 1.4 符号常量\r\n 1.5 字符输入/输出\r\n 1.6 数组\r\n 1.7 函数\r\n 1.8 参数——传值调用\r\n 1.9 字符数组\r\n 1.10 外部变量与作用域\r\n第2章 类型、运算符与表达式\r\n 2.1 变量名\r\n 2.2 数据类型及长度\r\n 2.3 常量\r\n 2.4 声明\r\n 2.5 算术运算符\r\n 2.6 关系运算符与逻辑运算符\r\n 2.7 类型转换\r\n 2.8 自增运算符与自减运算符\r\n 2.9 按位运算符\r\n 2.10 赋值运算符与表达式\r\n 2.11 条件表达式\r\n 2.12 运算符优先级与求值次序\r\n第3章 控制流\r\n 3.1 语句与程序块\r\n 3.2 if-else语句\r\n 3.3 else-if语句\r\n 3.4 switch语句\r\n 3.5 whil循环与for特环\r\n 3.6 do-while循环\r\n 3.7 break语句与continue语句\r\n 3.8 goto语句与标号\r\n第4章 涵数与程序结构\r\n第5章 指针与数组\r\n第6章 结构\r\n第7章 输入与输出\r\n第8章 UNIX系统接口\r\n附录A 参考手册\r\n附录B 标准库\r\n附录C 变更小结\r\n索引
Brian W.Kernighan贝尔实验室计算科学研究中心高级研究人员,著名的计算机科学家。他参加了UNIX系统、C语言、AWK语言和许多其他系统的开发,同时出版了许多在计算机领域具有影响的著作,如《The C Proguamming Language》、《The Elementsof Programming Style》等。
徐宝文,东南大学计算机科学与工程系教授,博士生导师,江苏省政协常委,江苏省计算机学会副理事长,江苏省软件行业协会副会长,中国计算机学会理事,中国软件行业协会理事。主要从事程序设计语言、软件工程等方面的教学与研究工作,负责承担十多项国家级、部省级科研项目;在国内外发表论文130多篇,出版著译作10多部;担任《实用软件详解丛书》与《新世纪计算机系列教材》的主编,第五次国际青年计算机学术地议大会主席;发起并主办过两次“全国程序设计语言发展与教学学术会议”;先后获航空航天部优秀青年教师、江苏省优秀教育工作者、江苏省优秀青年骨干教师、江苏省感世纪学术带头人等称号。
C语言是一种通用的程序设计语言。它同UNIX系统之间具有非常密切的联系——C语言是在UNIX系统上开发的, 并且,无论是UNIX系统本身还是其上运行的大部分程序,都是用C语言编写的。但是,C语言并不受限于任何一种操作系统或机器。由于它很适合用来编写编译器和操作系统, 因此被称为“系统编程语言”,但它同样适合于编写不同领域中的大多数程序。
C语言的很多重要概念来源于由Martin Richards开发的BCPL语言。BCPL对C语言的影响间接地来自于B语言,它是Ken Thompson为第一个UNIX系统而于1970年在DECPDP-7计算机上开发的。
BCPL和B语言都是“无类型”的语言。相比较而言,C语言提供了很多数据类型。其基本类型包括字符、具有多种长度的整型和浮点数等。另外,还有通过指针、数组、结构和联合派生的各种数据类型。表达式由运算符和操作数组成。任何一个表达式, 包括赋值表达式或函数调用表达式,都可以是一个语句。指针提供了与具体机器无关的地址算术运算。
C语言为实现结构良好的程序提供了基本的控制流结构:语句组、条件判断(if—else)、多路选择(switch)、终止测试在顶部的循环(while、for)、终止测试在底部的循环(do)、提前跳出循环(break)等。
函数可以返回基本类型、结构、联合或指针类型的值。任何函数都可以递归调用。局部变量通常是“自动的”, 即在每次函数调用时重新创建。函数定义可以不是嵌套的,但可以用块结构的方式声明变量。一个C语言程序的不同函数可以出现在多个单独编译的不同源文件中i,变量可以只在函数内部有效,也可以在函数外部但仅在一个源文件中有效,还可以在整个程序中都有效。
编译的预处理阶段将对程序文本进行宏替换、包含其他源文件以及进行条件编译。
C语言是一种相对“低级”的语言。这种说法并没有什么贬义,它仅仅意味着C语言可以处理大部分计算机能够处理的对象,比如字符、数字和地址。这些对象可以通过具体机器实现的算术运算符和逻辑运算符组合在一起并移动。
C语言不提供直接处理诸如字符串、集合、列表或数组等复合对象的操作。虽然可以将整个结构作为一个单元进行拷贝,但C语言没有处理整个数组或字符串的操作。除了由函数的局部变量提供的静态定义和堆栈外,C语言没有定义任何存储器分配工具,也不提供堆和无用内存回收工具。最后,C语言本身没有提供输入/输出功能,没有READ或WRITE语句, 也没有内置的文件访问方法。所有这些高层的机制必须由显式调用的函数提供。C语言的大部分实现已合理地包含了这些函数的标准集合。
类似地,C语言只提供简单的单线程控制流,即测试、循环、分组和子程序,它不提供多道程序设计、并行操作、同步和协同例程。
尽管缺少其中的某些特性看起来好像是一个严重不足(“这就意味着必须通过调用函数来比较两个字符串吗?”),但是把语言保持在一个适度的规模会有很多益处。 由于C语言相对较小,因此可以用比较小的篇幅将它描述出来,这样也很容易学会。程序员有理由期望了解、理解并真正彻底地使用完整的语言。
很多年来,C语言的定义就是《The C Programming Language》第1版中的参考手册。1983年,荚国国家标准协会(ANSI)成立了一个委员会以制定一个现代的、全面的C语言定义。最后的结果就是1988年完成的ANSI标准,即“ANSI C”。该标准的大部分特性已被当前的编译器所支持。
这个标准是基于以前的参考手册制定的。语言本身只做了相对较少的改动。这个标准的目的之一就是确保现有的程序仍然有效,或者当程序无效时,编译器会对新的定义发出警告信息。
对大部分程序员来说,最重要的变化是函数声明和函数定义的新语法。现在, 函数声明中可以包含描述函数实际参数的信息;相应地,定义的语法也做了改变。这些附加的信息使编译器很容易检测到因参数不匹配而导致的错误。根据我们的经验,这个扩充对语言非常有用。
新标准还对语言做了一些细微的改进:将广泛使用的结构赋值和枚举定义为语言的正式组成部分;可以进行单精度的浮点运算;明确定义了算术运算的属性,特别是无符号类型的运算;对预处理器进行了更详尽的说明。这些改进对大多数程序员的影响比较小。
该标准的第二个重要贡献是为C语言定义了一个函数库。它描述了诸如访问操作系统(如读写文件)、格式化输入/输出、 内存分配和字符串操作等类似的很多函数。该标准还定义了一系列的标准头文件,它们为访问函数声明和数据类型声明提供了统一的方法。这就确保了使用这个函数库与宿主系统进行交互的程序之间具有兼容的行为。该函数库很大程度上与UNIX系统的“标准I/O库”相似。这个函数库已在本书的第1版中进行了描述,很多系统中都使用了它。这一点对大部分程序员来说,不会感觉到有很大的变化。
由于大多数计算机本身就直接支持C语言提供的数据类型和控制结构,因此只需要一个很小的运行时库就可以实现自包含程序。由于程序只能够显式地调用标准库中的函数,因此在不需要的情况下就可以避免对这些函数的调用。除了其中隐藏的一些操作系统细节外, 大部分库函数可以用C语言编写,并可以移植。
尽管C语言能够运行在大部分的计算机上,但它同具体的机器结构无关。只要稍加用心就可以编写出可移植的程序, 即可以不加修改地运行于多种硬件上。ANSI标准明确地提出了可移植性问题,并预设了一个常量的集合,’借以描述运行程序的机器的特性。
C语言不是一种强类型的语言,但随着它的发展,其类型检查机制已经得到了加强:,尽管C语言的最初定义不赞成在指针和整型变量之间交换值,但并没有禁止,不过现在已经不允许这种做法了。ANSI标准要求对变量进行正确的声明和显式的强制类型转换,这在某些较完善的编译器中巳经得到了实现。新的函数声明方式是另一个得到改进的地方,编译器将对大部分的数据类型错误发出警告,并且不自动执行不兼容数据类型之间的类型转换。不过,C语言保持了其初始的设计思想, 即程序员了解他们在做什么,惟一的要求是程序员要明确地表达他们的意图。
同任何其他语言一样,C语言也有不完美的地方。某些运算符的优先级是不正确的;语法的某些部分可以进一步优化。尽管如此,对于大量的程序设计应用来说,C语言是一种公认的非常高效的、表示能力很强的语言。
本书是按照下列结构编排的:第1章将对C语言的核心部分进行简要介绍。其目的是让读者能尽快开始编写C语言程序, 因为我们深信,实际编写程序才是学习一种新语言的好方法。这部分内容的介绍假定读者对程序设计的基本元素有一定的了解。我们在这部分内容中没有解释计算机、编译等概念,也没有解释诸如n=n+1这样的表达式。我们将尽量在合适的地方介绍一些实用的程序设计技术,但是,本书的中心目的并不是介绍数据结构和算法。在篇幅有限的情况下,我们将专注于讲解语言本身。
第2章到第6章将更详细地讨论C语言的各种特性,所采用的方式将比第1章更加形式化一些。其中的重点将放在一些完整的程序例子上, 而并不仅仅只是一些孤立的程序段。第2章介绍基本的数据类型、运算符和表达式。第3章介绍控制流,如if-else、switch、while和for等。第4章介绍函数和程序结构——外部变量、作用域规则和多源文件等,同时还会讲述一些预处理器的知识。第5章介绍指针和地址运算。第6章介绍结构和联合。
第7章介绍标准库。标准库提供了一个与操作系统交互的公用接口。这个函数库是由ANSI标准定义的,这就意味着所有支持C语言的机器都会支持它,因此,使用这个库执行输入、输出或其他访问操作系统的操作的程序可以不加修改地运行在不同机器上。
第8章介绍C语言程序和UNIX操作系统之间的接口,我们将把重点放在输入/输出、文件系统和存储分配上。尽管本章中的某些内容是针对-UNIX系统所写的,但是使用其他系统的程序员仍然会从中获益, 比如深入了解如何实现标准库以及有关可移植性方面的一些建议。
附录A是一个语言参考手册。虽然C语言的语法和语义的官方正式定义是ANSI标准本身,但是,ANSI标准的文档首先是写给编译器的编写者看的,因此,对程序员来说不一定最合适。本书中的参考手册采用了一种不很严格的形式, 更简洁地对C语言的定义进行了介绍。附录B是对标准库的一个总结,它同样是为程序员而非编译器实现者准备的。附录C对标准C语言相对最初的C语言版本所做的变更做了一个简短的小结。但是,如果有不一致或疑问的地方,标准本身和各个特定的编译器则是解释语言的最终权威。本书的最后提供了本书的索引。