时至今日,c语言仍然是计算机领域的通用语言之一,但今天的c语言已经和最初的时候大不相同。本书最主要的一个目的就是通过一种“现代方法”来介绍c语言,实现客观评价c语言、强调标准化c语亨、强调软件工程、不再强调“手工优化”、强调与c++语言的兼容性的目标。本书分为c语言的基础特性、c语言的高级特性、c语言标准库和参考资料4个部分。每章都有“问与答”小节,给出一系列与本章内容相关的问题及其答案,此外还包含适量的习题。\r\n 本书是为大学本科阶段的c语言课程编写的教材,同时也非常适合作为其他一些课程的辅助用书。\r\n 作者简介:\r\n K.N.King,世界知名的计算机程序设计教育家,佐治亚州立大学数学与计算机科学系副教授。耶鲁大学计算机科学硕士,加州大学伯克利分校计算机科学博士,曾任教于佐治亚理工学院。除本书外,他还撰写了广受欢迎的教材Java Programming:From the Beginning,.并在Dr.Dobb''s Journal等权威杂志上发表了许多论文。业余时间,King教授还在多部电影中扮演过角色。
第1章 C语言概述\r\n第2章 C语言基本概念\r\n第3章 格式化的输入/输出\r\n第4章 表达式\r\n第5章 选择语句\r\n第6章 循环\r\n第7章 基本类型 \r\n第8章 数组\r\n第9章 函数\r\n第10章 程序结构\r\n第11章 指针\r\n第12章 指针和数组\r\n第13章 字符串\r\n第14章 预处理器\r\n第15章 编写大规模程序\r\n第16章 结构、联合和枚举\r\n第17章 指针的高级应用\r\n第18章 声明\r\n第19章 程序设计\r\n第20章 低级程序设计\r\n第21章 标准库\r\n第22章 输入/输出\r\n第23章 库对数值和字符数据的支持\r\n第24章 错误处理\r\n第25章 国际化特性\r\n第26章 其他库函数\r\n附录A C语言语法(图灵网站下载)\r\n附录B C语言运算符(图灵网站下载)\r\n附录C 标准C与经典C的比较(图灵网站下载)\r\n附录D 标准库函数(图灵网站下载)\r\n附录E ASCII字符集(图灵网站下载)\r\n参考文献(图灵网站下载)\r\n索引(图灵网站下载)
在计算机领域中,把显而易见的转变为有实用价值的,这一过程是“挫折”一词的生动体现。
我首先要敞开心扉告诉大家:多年来我与C语言之间一直保持着一种“爱恨交加”的关系。一方面,我享受着轻松自如地编写C程序的快乐,并且酷爱当今多种C编译器提供的各式开发环境;另一方面,我讨厌自己在编程中容易犯错,也厌倦了要留意C语言编程中常常要求的细节。更重要的是,我憎恶许多C程序员蔑视其他编程语言的态度。让我们一起客观地评价一下C语言:C语言不是编程语言的终结(当然,C++语言也不是);然而,C语言却是每位软件开发人员都应该掌握的一种编程语言。无论褒贬如何,C语言都已成为计算机领域的通用语言。
1975年,当C语言还是一种新兴的、尚未完全成熟的编程语言时,我就开始接触它了。随后,我有好几年没有和C打交道。然而,C语言被标准化之后,我决定重新审视一下这种语言。结果我惊喜地发现,一些C语言中致命的缺陷已经在标准化过程中得到了修正。(当然,C语言仍旧有不少值得改进的地方!)于是,我决定写一本书来展示C语言的崭新面貌,并且同时收集整理一下过去多年来C程序员所创造的智慧结晶。
目的
下面这些是本书试图实现的目标:
●清晰易读,而且尽可能带有趣味性。对普通读者来说,许多C语言的书籍都过于简洁了。甚至某些C语言书籍不是编写得一塌糊涂,就是平淡无趣。而我试图对C语言进行一种清晰、全面的讲解,并且决定用适当的幽默来激发读者阅读的兴趣。
●适用于广泛的读者群。我假设阅读本书的读者都只有一点点编程经验,而且他们都尚未精通某种具体的编程语言。我尽量减少“行话”而改用通俗易懂的词汇来定义用到的术语。同时,为了鼓励初学者,我还尝试了将某些高级内容从基本主题中分离出来。
●有权威性,但不是学究气十足。为了减少读者的麻烦,我在书中尽量涵盖了所有标准C的特性和库函数,包括信号、setjmp/longjmp和可变长度实际参数列表。同时,为了避免给读者造成负担,我还忽略了一些不必要的细节。
●具备简单易学的组织结构。根据多年教授C语言的经验,我强调循序渐进地展示C语言特性的重要性。针对有一定难度的主题,我采用了螺旋式的介绍方法。也就是,对于较难的主题先进行简要介绍,然后,在后续章节中再多次介绍该主题,逐渐增加细节内容。本书的进度是经过深思熟虑的。每章都按照循序渐进的方式进行组织,并且前后内容由浅入深,相互呼应。对于大多数学生来说,这种循序渐进的方法是最合适的:既避免产生无聊的内容,又防止出现“信息超载”。
●深入探讨语言特性。我不是仅描述语言的每个特性,或者只展示几个简单的特性应用的例题,而是尝试深入讲解每一种特性,并且探讨如何将这些特性应用到实际问题中。
●强调编写风格。对每位C程序员来说,采用一种统一的代码编写风格是非常重要的。但是,与其指定某种风格,我更愿意给出多种编写风格,让读者自己做出合理的选择,因为了解多种编写风格对阅读别人的程序是很有帮助的(有些程序员经常要花费大量时间阅读别人的程序)。
●避免依赖任何特定的计算机、编译器或者操作系统。因为C语言可以应用在如此多样的平台上,所以我试图避免编写的程序依赖于任何特定的计算机、编译器或操作系统。当然,使用C这样的语言完全忽略机器的细节也是不可能的。当此类问题不可避免时,我都以16位计算机和32位计算机的两种体系结构进行举例说明。当示例要依赖于某种特定操作系统时,我会讨论DOS和UNIX两种系统。
●用图示的方法阐明关键概念。因为图在理解C语言方方面面都起着至关重要的作用,所以我在书中加入了尽可能多的图。特别是我还试图通过图显示运算中不同阶段的数据状态来动态地描述算法。
现代方法到底是什么
本书最主要的一个目的就是想通过一种“现代方法”来介绍C语言。我试图通过以下这些途径来达成目标:
●正确看待C语言。我没有把C语言看成是唯一值得学习的编程语言,而是把它作为众多有用语言中的一种进行介绍。我在书中提到了最适合用C语言编写的程序类型。此外,我还展示了如何扬长避短地使用C语言。
●强调标准化C语言。我较少关注旧版C语言。只在某些章节偶尔提到经典(K&R)C,多在“问与答”部分。附录C列出了标准C和经典C之间的主要差异。
●揭穿神话。现今的某些书籍的作者常常会在C语言某些常见的假设上争论不休,而我却乐于揭穿C语言的某些神话,或者说是想对长久以来构成C语言传说的某些信条提出挑战。例如,有种说法始终认为指针的算术运算一定比数组下标操作快。我重新审查了C语言的旧惯例,并且保留了那些仍然有帮助的惯例。
●强调软件工程。我把C语言视为一种成熟的软件工程工具,因此我强调如何运用C语言来处理大规模程序开发过程中产生的问题。我坚持程序要易读、可维护、可靠且容易移植,同时还特别看重信息隐藏。
●不是在开始就介绍C语言的低级特性。虽然这些特性曾为早期C语言的各种系统编程提供了便利,但是现在它们已经不再适宜使用,因为C语言已经应用于大量不同的程序中。本书没有像其他大多数C语言书籍那样把这部分内容放在前面章节进行介绍,而是推迟到第20章再进行讲述。
●不再强调“手工优化”。某些书籍指导读者编写并不简单、清晰的代码,仅仅是为了稍稍提高程序效率。然而,面对现今C语言编译器的大量优化技术,这种代码优化工作常常不再必要;事实上,它们适得其反。
●强调与C++语言的兼容性。有关这方面的内容,我会稍后进行详细介绍。
“问与答”部分
每章的末尾都有一个“问与答”部分,汇集了与本章内容相关的问题及其答案。“问与答”部分的内容包括:
●常见问题。我尽力回答了某些频繁出现在我的课堂里、其他书籍中,以及和C语言相关的新闻组里的问题。
●对一些难以理解的问题的进一步讨论和澄清。虽然具有多种编程语言经验的读者会满足于简明扼要的说明和少量的示例,但是缺乏经验的读者却需要更多的内容以帮助理解。
●非主流的问题。某些问题所引发的并不是所有读者都感兴趣的技术讨论。
●某些对普通读者来说过于超前或深奥的内容。这类问题都用星号(*)进行了标记。好奇且有一定编程经验的读者也许希望立刻深入研究这些问题,而另外一些读者则需要在首次阅读时跳过这部分内容。提示:这类问题往往引用后续章节的内容。
●多种C语言编译器的常见差异。我讨论了一些经常用到的(而非标准的)特性。DOS系统和UINX系统都对这类特性提供支持。
“问与答”中的某些问题与对应章中某些特定的内容直接相关,这些特定内容会在对应位置用一种特殊的图标 标记,从而提示读者有进一步的信息。
其他特色
除了“问与答”部分,我还加入了另外一些有用的特色,其中一些特色用简单但是独特的图标进行了标识。
●警告(△)警示读者一些常见的陷阱。C语言以其陷阱多而出名。要记录所有的陷阱非常困难。我试图挑选出最常见或最重要的陷阱供大家参考。
●引用(→前言)提供一种类似超文本的能力来查找信息。多数引用指向稍后的章节中才能提到的主题,但是确有某些引用指向先前的主题供读者回顾。
●惯用法是经常可以在C语言程序中看到的代码模式。它常被标记出来以便于速查参考。
●可移植性技巧为编写不依赖于特定的计算机、编译器或操作系统的程序所需的技巧和心得。
●附加说明包含一些严格来讲并不属于C语言的内容,但却是每位熟练的C程序员都应该知道的知识,比如无符号整数、IEEE浮点数标准以及Unicode编码等。(附加说明的示例可参见本页下面的“源代码”说明。)
●附录提供有价值的参考资料信息。
程序
选择作为例证的程序并不是件轻松的工作。如果程序过于简洁和做作,那么读者将无法体会如何将这些特性应用于现实世界里。一方面,如果程序过于真实,那么它的要点将很容易被忽略在过多的细节中。我采取了折中方案。在首次介绍概念时,先通过小而简单的示例使内容清晰,再逐步建立完整的程序。我没有使用过长的程序,因为根据我个人的经验,授课者没有时间介绍这些,而学生们也不会有耐心去阅读。但是,我没有忽视创作大程序所引发的问题,这些在第15章和第19章中进行了详细的介绍。
源代码
本书中所有程序的源代码都可以从图灵网站http://www.turingbook.com)下载。有关本书原版的校正、修改和最新消息可以http://www.gsu.edu/~matknk/cbook获取。
C++语言的介绍
本书从一开始就考虑到要完全兼容C++语言,因此读者不会被培养出那些稍后必须忘掉的习惯。本书通过下面3种方式为读者继续学习C++语言做了铺垫:
●强化现代设计规则,比如信息隐藏。
●一些分散在书中的C++语言的简要论述。其中,每次论述都用特殊的 符号标记。
●第19章提供的详细的C++语言概述。
读者
本书是为大学本科阶段的C语言课程编写的教材。具有其他高级语言或汇编语言的编程经验会很有帮助,不过这些经验对于会用计算机的读者(我的编辑称他们为“熟练的初学者”)来说并不是必需的。
因为本书内容齐备,自成一体,并且既可用于学习又可作为参考,所以它非常适合作为其他一些课程的辅助读物,如数据结构、编译器设计、操作系统、计算机图形学及其他要用C语言进行项目设计的课程。
“问与答”部分以及对实际问题的强调,使得本书也可以引起另外一
无封面