C程序设计语言第二版前言

本文介绍了C语言作为通用编程语言的基础,强调其与UNIX系统的关系,数据类型、控制流、函数、预处理器的应用,以及C语言的低级特性、标准库和可移植性。它详细讲述了C语言的发展历史和现代标准,指出尽管存在一些不足,C语言仍是高效和强大的编程工具。
摘要由CSDN通过智能技术生成

C语言是一种通用的程序设计语言。它与UNIX系统之间具有非常密切的联系——C语言是在UNIX系统上开发的,并且,无论是UNIX系统本身还是其上运行的大部分程序,都是用C语言编写的。但是,C语言并不受限于任何一种操作系统和机器。由于它很适合用来编写编译器和操作系统,因此被称为“系统编程语言”,但它同样适合于编写不同领域中的大多数程序。

C语言的很多重要概念来源于由Martin Richards开发的BCPL语言。BCPL对C语言的影响间接地来自于B语言,它是Ken Thompson为第一个UNIX系统而于1970年在DEC PDP-7计算机上开发的。

BCPL和B语言都是“无类型”的语言。相比较而言,C语言提供了很多数据类型。其基本类型包括字符、具有多种长度的整型和浮点数等。另外,还有通过指针、数组、结构和联合派生的各种数据类型。表达式由运算符和操作数组成。任何一个表达式,包括赋值表达式或函数调用表达式,都可以是一个语句。指针提供了与具体机器无关的地址算术运算。

C语言为实现结构良好的程序提供了基本的控制流结构:语句组、条件判断(if-else)、多路选择(switch)、终止测试在顶部的循环(while、for)、终止测试在底部的循环(do)、提前跳出循环(break)等。

函数可以返回基本类型、结构、联合或指针类型的值。任何函数都可以递归调用。局部变量通常是“自助的”,即在每次函数调用时重新创建。函数定义不可以是嵌套的,但可以用块结构的方式声明变量。一个C语言程序的不同函数可以出现在多个单独编译的不同源文件中。变量可以只在函数内部有效,也可以在函数外部但仅在一个源文件中有效,还可以在整个程序中有效。

编译的预处理阶段将对程序文本进行宏替换、包含其他源文件以及进行条件编译。

C语言是一种相对“低级”的语言。这种说法并没有什么贬义,它仅仅意味着C语言可以处理大部分计算机能够处理的对象,比如字符、数字和地址。这些对象可以通过具体机器实现的算术运算符和逻辑运算符组合在一起并移动。

C语言不提供直接处理诸如字符串、集合、列表或数组等复合对象的操作。虽然可以将整个结构作为一个单元进行拷贝,但C语言没有处理整个数组或字符串的操作。除了由函数的局部变量提供的静态定义和堆栈外,C语言没有定义任何存储器分配工具,也不提供堆和无用内存回收工具。最后,C语言本身没有提供输入/输出功能,没有READ或WRITE语句,也没有内置的文件访问方法。所有这些高层的机制必须由显式调用的函数提供。C语言的大部分实现已合理地包含了这些函数的标准合集。

类似地,C语言只提供简单的单线程控制流,即测试、循环、分组和子程序,它不提供多道程序设计、并行操作、同步和协同例程。

尽管缺少其中的某些特性看起来好像是一个严重不足(这就意味着必须通过调用函数来比较两个字符串),但是把语言保持在一个适度的规模会有很多益处。由于C语言相对较小,因此可以用比较少的篇幅将它描述出来,这样也很容易学会。程序员有理由期望了解、理解并真正彻底地使用完整的语言。

很多年来,C语言的定义就是本书第1版中的参考手册。1983年,美国国家标准协会(ANSI)成立了一个委员会以制定一个现代的、全面的C语言定义。最后的结果就是1988年完成的ANSI标准,即“ANSI C”。该标准的大部分特性已被当前的编译器所支持。

这个标准是基于以前的参考手册制定的。语言本身只做了相对较少的改动。这个标准的目的之一就是确保现有的程序任然有效,或者当程序无效时,编译器会对新的定义发出警告信息。

对大部分程序员来说,最重要的变化是函数声明和函数定义的新语法。现在,函数声明中可以包含描述函数实际参数的信息;相应地,定义的语法也做了改变。这些附加的信息使编译器很容易检测到因参数不匹配而导致的错误。根据我们的经验,这个扩充对语言非常有用。

新标准还对语言做了一些细微的改进:将广泛使用的结构赋值和枚举定义为语言的正式组成部分;可以进行单精度的浮点运算;明确定义了算术运算的属性,特别是无符号类型的运算;对预处理器进行了更详尽的说明。这些改进对大多数程序员的影响比较小。

该标准的第二个重要贡献是为C语言定义了一个函数库。它描述了诸如访问操作系统(如读写文件)、格式化输入/输出、内存分配和字符串操作等类似的很多函数。该标准还定义了一系列的标准头文件,它们为访问函数声明和数据类型声明提供了统一的方法。这就确保了使用这个函数库与宿主系统进行交互的程序之间具有兼容的行为。 该函数库很大程度上与UNIX系统的“标准I/O库”相似。这个函数库已在本书第一版中进行了描述,很多系统中都使用了它。这一点对大部分程序员来说,不会感觉到有很大的变化。

由于大多数计算机本身就直接支持C语言提供的数据类型和控制结构,因此只需要一个很小的运行时库就可以实现自包含程序。由于程序只能够显式地调用标准库中的函数,因此在不需要的情况下就可以避免对这些函数的调用。除了其中隐藏的一些操作系统细节外,大部分库函数可以用C语言编写,并可以移植。

尽管C语言能够运行在大部分的计算机上,但它同具体的机器结构无关。只要稍加用心就可以编写出可移植的程序,即可以不加修改地运行于多种硬件上。ANIS标准明确地提出了可移植性问题,并预设了一个常量的集合,借以描述运行程序的机器的特性。

C语言不是一种强类型的语言,但随着它的发展,其类型检查机制已经得到了加强。尽管C语言的最初定义不赞成在指针和整型变量之间交换值,但并没有禁止,不过现在已经不允许这种做法了。ANSI标准要求对变量进行正确的声明和显示的强制类型转换,这在某些较完善的编译器中已经得到了实现。新的函数声明方式是另一个得到改进的地方。编译器将对大部分的数据类型错误发出警告,并且不自动执行不兼容数据类型之间的类型转换。不过,C语言保持了其初始的设计思想,即程序员了解他们在做什么,唯一的要求是程序员要明确地表达他们的意图。

同任何其他语言一样,C语言也有不完美的地方:某些运算符的优先级是不正确的,语法的某些部分是可以进一步优化。尽管如此,对于大量的程序设计应用来说,C语言仍是一种公认的非常高效的、表示能力很强的语言。

本书是按照下列结构编排的:第一章将对C语言的核心部分进行简要的介绍。其目的是让读者能尽快开始编写C语言程序,因为我们深信,实际编写程序才是学习一种新语言的好方法。这部分内容的介绍假定读者对程序设计的基本元素有一定的了解。我们在这部分内容中没有解释计算机、编译等概念,也没有解释诸如n=n+1这样的表达式。我们将尽量在合适的地方介绍一些使用的程序设计技术,但是,本书的中心目的并不是介绍数据结构和算法。在篇幅有限的情况下,我们将专注于讲解语言本身。

第2章到第6章将更详细地讨论C语言的各种特性,所采用的方式将比第一章更加形式化一些。其中的重点将放在一些完整的程序例子上,而并不仅仅是一些孤立的程序段。第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语言版本所做的变更做了一个简短的小结。但是,如果有不一致或疑问的地方,标准本身和各个特定的编译器则是解释语言的最终权威。本书的最后提供了本书本书的索引。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值