主机与独立环境
依赖于函数库对语言进行扩展,这一点对于C语言的实际使用有着重大的影响。这不仅使标准I/O函数库对应用程序员来说非常重要,还有其它的好些函数也几乎 被理所当然地当成了这个语言不可或缺的一部分。字符串处理、排序及比较、字符操作以及类似的功能,除了在极其特殊的应用场合之外,总是毫无悬念地存在。
由于C语言如此异乎异常地依靠函数库来完成实际工作,全面地定义支持函数也就成为了C语言标准的一个重要任务。函数库所涉及到的问题,和为C语言本身提供 一个紧凑的定义相比,要复杂许多。这是因为函数库可以被高水平的用户扩展和修改,而且在K&R中也只对其进行了部分定义。在实践中,这造成了非常多相似但 又不同的支持函数库被广泛使用。到目前为止,标准委员会最大的难题就是对必须提供的函数库支持给出好的定义。从C语言的最终使用者的角度来看,这项工作, 将是C语言标准中迄今为止最有价值的工作。
然而,并非所有C程序都被用于同样类型的应用。标准函数库对于“数据处理”类型的应用很有用,其中文件I/O和数字、字符数据被广为使用。对于C语言来说,还有一个同等重要的应用领域--即“嵌入式系统”领域--包括诸如过程控制、实时运算等等应用。
C语言标准了解这个问题,也提供了解决方案。C语言标准的很大一部分是定义在主机环境中必须提供的库函数。所谓主机环境就是指提供标准函数库的环境。C语言标准既允许主机环境,也允许独立环境, 并且下了一番工夫来解释这两者的区别。什么样的人会不用函数库呢?凡是写所谓“独立程序”的人都不用。操作系统,还有嵌入式系统,诸如机器控制器和仪器固 件,这些都是主机环境并不适用的例子。为主机环境所写的程序必须要注意库函数所用的名称都是被系统保留的。而在独立环境中就没有这样的限制,尽管使用标准 函数库里用到的名称并不是个好主意--这仅仅是因为有可能会误导读者。第九章中会讲到库函数的使用和名称。
印刷体例
本书试图在特殊术语或专业术语的使用方面保持一致。对C语言来说有特殊含义的词汇,如保留字或库函数名称,都使用不同的字体。例如int以及printf。在本书中,如果某个术语对于C语言没有意义,但对于C语言标准或本书的文字有特别意义,则使用粗体字, 除非之前不远处刚刚介绍过。这些术语不是处处都是粗体的,因为那样只会很快让读者感到厌烦。你应该已经注意到了,斜体字也被时不时地用作强调,或是用来引 入宽泛定义的术语。不管函数名、关键字等等是否以大写字母开头,当它出现在一句话的开始时第一个字母都会大写;在这个问题上不管是大写还是小写都不会让人 满意(译注3)。当“特殊术语”偶尔由于上下文的原因有可能被按字面意思理解的时候,我们也会加上引号。而其它所有体例,要么是作者信手拈来,要么纯属意 外。
章节次序
本书的章节大致上和C语言指令集的入门课程的教法一致。本书开始先概述C语言最基本的部分,这样可以让你很快写出有用的程序。概述后面紧跟着的,是对前面 没有讲到的部分的详细讲解。然后继续深入讨论标准函数库。这也就意味着,从理论上来说,如果你真的想的话,你可以读到任何地方然后停下来,这时你仍然能够 学到C语言的一个比较清晰明了的子集。如果你已经有一些C语言的基础,那么你会觉得第一章的进度有些慢。不过坚持读一读还是有好处的,哪怕只读一遍也好。
范例程序
除了那些最简单的例子以外,本书中出现的所有例子都在一个声称遵从C标准的编译器里测试过。所以,绝大部分的例子很有可能都是正确的,除非我们错误解理了C标准,而这个编译器的开发者也犯了同样的错误。无论如何,经验告诉我们,无论如何仔细地检查,也难免百密一疏。因此,如果你发现错误,还望海涵。
以权威为准
本书的目的是以通俗易懂的方式描述由C标准所定义的C语言,同时又能给人以启发。本书试图解释C标准晦涩文字的实际含义,并以更为“简单”的文字表达出 来。我们已经尽可能地不出错,但你要记住,C语言唯一、完整的定义只有C标准本身。我们在这里解释C标准的含义,完全有可能并不是标准委员所要指定的含 义。我们解释的方式也完全可能比较宽泛,不如C标准里的精确。如果你有任何疑问的话,一定要去读C标准!C标准并不是写出来让你容易读的,但它应当是准确、没有歧义的。权威的最终解释,除此之外没有第二家。
标准委员会地址
C语言标准可以从以下地址获取:
CBEMA,
311 First Street, NW,
Suite 500,
Washington DC 20001-2178,
USA.
Phone (+1) (202) 737 8888
Mike Banahan
Declan Brady
Mark Doran
1991年1月
译者注:
[3] 由于中文对于夹杂其中的英文大小写没有严格要求,反而没有这个问题。由于C语言是区分大小写的,所以译者将不进行此类大小写转换,即使在一句开头也保留C程序原始的大小写,以避免对C语言本身产生误解。