[这是 C FAQ 列表的完整版本书籍的前言:《C 编程常见问题解答》 (C Programming FAQs: Frequently Asked Questions),Addison-Wesley 出版社,1995 年,ISBN 0-201-84519-9。]

前言

1979 年的某个时候,我听到很多人谈论这门相对较新的语言 C,以及当时刚出版的关于它的书。我买了一本 K&R 书,也就是 Brian Kernighan 和 Dennis Ritchie 所著的《C 编程语言》(The C Programming Language),但它在我的书架上放了一段时间,因为我当时没有迫切需要(此外,那时我还是个大一新生)。然而,最终它被证明是一次非常幸运的购买,因为当我终于开始阅读它时,我便爱不释手:从那时起,我一直在用 C 编程。

1983 年,我接触到了 Usenet 新闻组 net.lang.c,那是(它的后继者 comp.lang.c 至今仍是)一个绝佳的学习 C 的地方,可以了解其他人都对 C 有哪些疑问,并发现你可能并非对 C 了如指掌。 C 尽管看起来很简单,但却有一些相当不直观的方面,而且某些问题反复出现。这本书就是根据我在 1990 年 5 月开始发布到 comp.lang.c 的常见问题解答 (``FAQ'') 列表,收集了其中一些问题及其解答。

然而,我必须补充一点,这本书并非旨在批评 C 语言,也不是对其进行“抨击”。人们很容易将用户在使用工具时遇到的困难归咎于该语言(或任何工具),或者声称一个设计得当的工具“应该”能够防止用户滥用它。因此,像本书这样列出大量误用情况的书,很容易被视为一场诉苦,试图表明该语言存在无法挽回的缺陷。但事实绝非如此。

如果我不认为 C 是一门伟大的语言,或者我不享受用它编程,我绝不可能学到足够的 C 来写这本书,我今天也不会试图通过写这本书来让 C 对其他人来说更易于使用。我确实喜欢 C,我之所以教授 C 课程,并在互联网上花时间参与关于它的讨论,其中一个原因是我希望能发现 C(或一般编程)的哪些方面难以学习,或者阻碍人们有效、高效地编程。这本书代表了我学到的一些东西:这些问题无疑是人们最常遇到的难题,而且这些答案经过了几年的提炼,旨在确保人们在理解它们时不会遇到太多麻烦。

如果这些答案中存在任何错误,读者肯定会遇到困难。尽管审阅者和我已尽力消除它们,但要从一本大部头的书稿中根除最后一个错误,就像从程序中消灭最后一个 bug 一样困难。我将非常感谢任何发送给我的更正或建议,可以通过出版商或下面的电子邮件地址与我联系。我愿为第一个发现任何错误的人提供惯例的 1.00 美元奖励。如果您可以访问互联网,可以在 问题 20.40 中提到的 ftp 和 http 地址上查看勘误列表(以及发现者记分卡)。

正如我希望已经说明的那样,这本书不是对 C 编程语言的批判,也不是对我最初学习 C 的那本书的批判,更不是对其作者的批判。我不仅仅是从 K&R 学到了 C;我还学到了很多关于编程的知识。当我思考自己对 C 编程文献的贡献时,我唯一的遗憾是本书未能达到 K&R 第二版中一个很好的观点,即“C 并非一门大语言,也不适合用一本大书来阐述。” 我希望那些最深刻欣赏 C 的简洁和精确(以及 K&R 的这些优点)的人,不会因为本书中反复强调某些观点,或以三种略有不同的方式表达,而过于介意。

虽然我的名字印在封面上,但这本书背后有许多人的功劳,要从哪里开始表示感谢,实属不易。从某种意义上说,comp.lang.c 的每一位读者(如今估计有 320,000 人)都是贡献者:这本书背后的 FAQ 列表首先是为 comp.lang.c 编写的,而这本书保留了良好的 comp.lang.c 讨论风格。

我希望这本书也保留了我开始阅读 net.lang.c 时所学的关于正确 C 编程的理念。因此,我首先要感谢那些在我脑海中最为清晰、一致地阐述这一理念的发布者:Doug Gwyn、Guy Harris、Karl Heuer、Henry Spencer 和 Chris Torek。这些先生们多年来表现出非凡的耐心,慷慨而智慧地回答了无数问题。是我第一个勇于将常见问题记录下来,但我绝不愿给人一种答案是我的错觉。我曾经是学生(我相信是 Guy 回答了我关于本卷 问题 5.10 的帖子),我欠那些先我而行的大师们一份真正的恩情。这本书既属于他们,也属于我,但我保留对我在呈现过程中所做的任何不足或错误的责任。

在线 FAQ 列表在成为这本书的过程中增长了三倍,其增长过程有时有点仓促和不协调。Mark Brader、Vinit Carpenter、Stephen Clamage、Jutta Degener、Doug Gwyn、Karl Heuer、Joseph Kent 和 George Leach 阅读了提案或完整的草稿,并帮助对过程进行了一些控制;我感谢他们提出的许多仔细的建议和更正。他们的努力源于共同希望提高编程界对 C 的整体理解的愿望。我感谢他们的奉献。

其中三位审阅者也是在线 FAQ 列表的长期贡献者。我感谢 Jutta Degener 和 Karl Heuer 多年来提供的帮助,尤其感谢 Mark Brader,自五年前我首次开始发布 comp.lang.c FAQ 列表以来,他一直是我的最坚定的批评者。我不知道他是如何有毅力提出如此多的建议和更正,并克服我持续的、顽固的拒绝接受其中一些建议,即使(正如我最终理解的那样)它们确实改进。您可以感谢 Mark 为本书的许多解释的形式做出的贡献,并将我因歪曲其中任何内容而归咎于我。

其他杂项感谢:感谢 Susan Cyr 创作封面艺术;感谢 Bob Dinse 和 Eskimo North 提供对这类项目至关重要的网络访问;感谢 Bob Holland 提供我完成大部分写作所用的计算机;感谢 Pete Keleher 开发的 Alpha 文本编辑器;感谢华盛顿大学数学研究与工程图书馆的馆藏;以及感谢华盛顿大学海洋学系允许我借用他们的磁带驱动器来访问我尘封已久的 Usenet 帖子存档。

感谢 Tanmoy Bhattacharya 提供 问题 11.10 中的示例,感谢 Arjan Kenter 提供 问题 13.7 中的代码,感谢 Tomohiko Sakamoto 提供 问题 20.31 中的代码,以及感谢 Roger Miller 提供 问题 11.35 中的代码行。

最后,我想感谢我在 Addison-Wesley 的编辑 Debbie Lafferty,感谢她有一天拍了拍我的电子肩膀,问我是否有兴趣写这本书。我感兴趣,而您现在手中拿着它,我希望它能帮助您像我一样享受 C 编程。

Steve Summit
scs@eskimo.com

华盛顿州西雅图
1995 年 7 月