猜你喜欢
C程序设计语言(原书第2版·新版 典藏版)  [The C Programming Language Second Edition]

C程序设计语言(原书第2版·新版 典藏版) [The C Programming Language Second Edition]

书籍作者:布莱恩·W.克尼汉 ISBN:9787111617945
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:8290
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介
在计算机发展的历史上,没有哪一种程序设计语言像C语言这样应用如此广泛。
  《C程序设计语言(原书第2版·新版 典藏版)》原著即为C语言的设计者之一DennisM.Ritchie和著名的计算机科学家BrianW.Kernighan合著的一本介绍C语言的经典著作。我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。人们熟知的“hello,world”程序就是由《C程序设计语言(原书第2版·新版 典藏版)》首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。原著第2版根据1987年制定的ANSIC标准做了适当的修订,引入了新的语言形式,并增加了新的示例。通过简洁的描述、典型的示例,作者全面、系统、准确地讲述了C语言的各个特性以及程序设计的基本方法。对于计算机从业人员来说,《C程序设计语言(原书第2版·新版 典藏版)》是一本必读的程序设计语言方面的参考书。
作者简介
布莱恩· W. 克尼汉(Brian W. Kernighan) 贝尔实验室计算科学研究中心高级研究人员,的计算机科学家。他参加了UNIX 系统、C语言、AWK语言和许多其他系统的开发,同时出版了许多在计算机领域具有影响的著作。
[美]丹尼斯· M. 里奇(Dennis M.Ritchie) 1967年加入贝尔实验室,曾任该实验室计算科学研究中心系统软件研究部主任。他和Ken L.Thompson共同设计并实现的C语言改变了程序设计语言发展的轨迹,是程序设计语言发展过程中的一个重要里程碑。与此同时,他们两人还设计并实现了UNIX 操作系统。正是由于这两项巨大贡献,Dennis M.Ritchie于1983年获得了计算机界的*高奖—图灵奖。此外,他还获得了ACM、IEEE、贝尔实验室等授予的多种奖项。
前言
第2版前言
The C Programming Language, Second Edition
自从1978年本书第1版出版以来,计算机领域经历了一场革命。大型计算机的功能越来越强大,而个人计算机的性能也可以与十多年前的大型机相媲美。在此期间,C语言也在悄悄地演进,其发展早已超出了它仅仅作为UNIX操作系统的编程语言的初衷。
C语言普及程度的逐渐增加以及该语言本身的发展,加之很多组织开发出了与其设计有所不同的编译器,所有这一切都要求对C语言有一个比本书第1版更精确、更适应其发展的定义。1983年,美国国家标准协会(ANSI)成立了一个委员会,其目标是制定“一个无歧义性的且与具体机器无关的C语言定义”,而同时又要保持C语言原有的“精神”。结果产生了C语言的ANSI标准。
ANSI标准规范了一些在本书第1版中提及但没有具体描述的结构,特别是结构赋值和枚举。该标准还提供了一种新的函数声明形式,允许在使用过程中对函数的定义进行交叉检查。标准中还详细说明了一个具有标准输入/输出、内存管理和字符串操作等扩展函数集的标准库。它精确地说明了在C语言原始定义中并不明晰的某些特性的行为,同时还明确了C语言中与具体机器相关的一些特性。
本书第2版介绍的是ANSI标准定义的C语言。尽管我们已经注意到了该语言中变化了的地方,但我们还是决定在这里只列出它们的新形式。最重要的原因是,新旧形式之间并没有太大的差别,最明显的变化是函数的声明和定义。目前的编译器已经能够支持该标准的大部分特性。
我们将尽力保持本书第1版的简洁性。C语言并不是一种大型语言,也不需要用一本很厚的书来描述。我们在讲解一些关键特性(比如指针)时做了改进,它是C语言程序设计的核心。我们重新对以前的例子进行了精练,并在某些章节中增加了一些新例子。例如,我们通过实例程序对复杂的声明进行处理,以将复杂的声明转换为描述性的说明或反之。像前一版中的例子一样,本版中所有例子都以可被机器读取的文本形式直接通过了测试。
附录A只是一个参考手册,而非标准,我们希望通过较少的篇幅概述标准中的要点。该附录的目的是帮助程序员更好地理解语言本身,而不是为编译器的实现者提供一个精确的定义—这正是语言标准所应当扮演的角色。附录B对标准库提供的功能进行了总结,它同样是面向程序员而非编译器实现者的。附录C对ANSI标准相对于以前版本所做的变更进行了小结。
我们在第1版中曾说过:“随着使用经验的增加,使用者会越来越感到得心应手。”经过十几年的实践,我们仍然这么认为。我们希望这本书能够帮助读者学好并用好C语言。
非常感谢帮助我们完成本书的朋友们。Jon Bentley、Doug Gwyn、Doug McIlroy、Peter Nelson和Rob Pike几乎对本书手稿的每一页都提出了建议。我们非常感谢Al Aho、Dennis Allison、Joe Campbell、G. R. Emlin、Karen Fortgang、Allen Holub、Andrew Hume、Dave Kristol、John Linderman、Dave Prosser、Gene Spafford和Chris Van Wyk等人,他们仔细阅读了本书。我们也收到了来自Bill Cheswick、Mark Kernighan、Andy Koenig、Robin Lake、Tom London、Jim Reeds、Clovis Tondo和Peter Weinberger等人的很好的建议。Dave Prosser为我们回答了很多关于ANSI标准的细节问题。我们大量地使用了Bjarne Stroustrup的C++翻译程序进行程序的局部测试。Dave Kristol为我们提供了一个ANSI C编译器以进行最终的测试。Rich Drechsler帮助我们进行了大量的排版工作。
真诚地感谢每个人!

Brian W. Kernighan
Dennis M. Ritchie




第1版前言
The C Programming Language, Second Edition
C语言是一种通用的程序设计语言,其特点包括简洁的表达式、流行的控制流和数据结构、丰富的运算符集等。C语言不是一种“很高级”的语言,也不“庞大”,并且不专用于某个特定的应用领域。但是,C语言的限制少,通用性强,这使得它比一些公认为功能强大的语言使用更方便、效率更高。
C语言最初是由Dennis Ritchie为UNIX操作系统设计的,并在DEC PDP-11计算机上实现。UNIX操作系统、C编译器和几乎所有的UNIX应用程序(包括编写本书时用到的所有软件)都是用C语言编写的。同时,还有一些适用于其他机器的编译器产品,比如IBM System/370、Honeywell 6000和Interdata 8/32等。但是,C语言不受限于任何特定的机器或系统,使用它可以很容易地编写出不经修改就可以运行在所有支持C语言的机器上的程序。
本书的目的是帮助读者学习如何用C语言编写程序。本书的开头有一个指南性的引言,目的是使新用户能尽快地开始学习;随后在不同的章节中介绍了C语言的各种主要特性;本书的附录中还包括一份参考手册。本书并不仅仅讲述语言的一些规则,而是采用阅读别人的代码、自己编写代码、修改某些代码等不同的方式来指导读者进行学习。书中的大部分例子都可以直接完整地运行,而不只是孤立的程序段。所有例子的文本都以可被机器读取的文本形式直接通过了测试。除了演示如何有效地使用语言外,我们还尽可能地在适当的时候向读者介绍一些高效的算法、良好的程序设计风格以及正确的设计原则。
本书并不是一本有关程序设计的入门性
目录
出版者的话
中文版序
译者序
校译者简介
第2版前言
第1版前言
引言
第1章 导言1
1.1 入门1
1.2 变量与算术表达式3
1.3 for语句8
1.4 符号常量9
1.5 字符输入/输出9
1.5.1 文件复制10
1.5.2 字符计数11
1.5.3 行计数13
1.5.4 单词计数14
1.6 数组15
1.7 函数17
1.8 参数—传值调用19
1.9 字符数组20
1.10 外部变量与作用域22
第2章 类型、运算符与表达式27
2.1 变量名27
2.2 数据类型及长度27
2.3 常量28
2.4 声明31
2.5 算术运算符32
2.6 关系运算符与逻辑运算符32
2.7 类型转换33
2.8 自增运算符与自减运算符37
2.9 位运算符38
2.10 赋值运算符与表达式40
2.11 条件表达式41
2.12 运算符优先级与求值次序42
第3章 控制流45
3.1 语句与程序块45
3.2 if-else语句45
3.3 else-if语句46
3.4 switch语句48
3.5 while循环与for循环49
3.6 do-while循环52
3.7 break语句与continue语句53
3.8 goto语句与标号54
第4章 函数与程序结构57
4.1 函数的基本知识57
4.2 返回非整型值的函数60
4.3 外部变量62
4.4 作用域规则68
4.5 头文件69
4.6 静态变量70
4.7 寄存器变量71
4.8 程序块结构72
4.9 初始化72
4.10 递归73
4.11 C预处理器75
4.11.1 文件包含75
4.11.2 宏替换76
4.11.3 条件包含78
第5章 指针与数组79
5.1 指针与地址79
5.2 指针与函数参数81
5.3 指针与数组83
5.4 地址算术运算86
5.5 字符指针与函数89
5.6 指针数组以及指向指针的指针92
5.7 多维数组95
5.8 指针数组的初始化97
5.9 指针与多维数组97
5.10 命令行参数98
5.11 指向函数的指针102
5.12 复杂声明105
第6章 结构111
6.1 结构的基本知识111
6.2 结构与函数113
6.3 结构数组115
6.4 指向结构的指针119
6.5 自引用结构121
6.6 表查找125
6.7 类型定义(typedef)127
6.8 联合128
6.9 位字段130
第7章 输入与输出133
7.1 标准输入/输出133
7.2 格式化输出—printf函数135
7.3 变长参数表136
7.4 格式化输入—scanf函数137
7.5 文件访问140
7.6 错误处理—stderr和exit143
7.7 行输入和行输出144
7.8 其他函数145
7.8.1 字符串操作函数145
7.8.2 字符类别测试和转换函数146
7.8.3 ungetc函数146
7.8.4 命令执行函数146
7.8.5 存储管理函数147
7.8.6 数学函数147
7.8.7 随机数发生器函数148
第8章 UNIX系统接口149
8.1 文件描述符149
8.2 低级I/O—read和write150
8.3 open、creat、close和unlink151
8.4 随机访问—lseek153
8.5 实例—fopen和getc函数的实现154
8.6 实例—目录列表157
8.7 实例—存储分配程序162
附录A 参考手册167
A.1 引言167
A.2 词法规则167
A.2.1 记号167
A.2.2 注释167
A.2.3 标识符167
A.2.4 关键字168
A.2.5 常量168
A.2.6 字符串字面值170
A.3 语法符号170
A.4 标识符的含义170
A.4.1 存储类171
A.4.2 基本类型171
A.4.3 派生类型172
A.4.4 类型限定符172
A.5 对象和左值172
A.6 转换173
A.6.1 整型提升173
A.6.2 整型转换173
A.6.3 整数和浮点数173
A.6.4 浮点类型173
A.6.5 算术类型转换173
A.6.6 指针和整数174
A.6.7 void175
A.6.8 指向void的指针175
A.7 表达式175
A.7.1 指针生成176
A.7.2 初等表达式176
A.7.3 后缀表达式177
A.7.4 一元运算符179
A.7.5 强制类型转换180
A.7.6 乘法类运算符180
A.7.7 加法类运算符181
A.7.8 移位运算符181
A.7.9 关系运算符182
A.7.10 相等类运算符182
A.7.11 按位与运算符183
A.7.12 按位异或运算符183
A.7.13 按位或运算符183
A.7.14 逻辑与运算符183
A.7.15 逻辑或运算符183
A.7.16 条件运算符184
A.7.17 赋值表达式184
A.7.18 逗号运算符185
A.7.19 常量表达式185
A.8 声明185
A.8.1 存储类说明符186
A.8.2 类型说明符187
A.8.3 结构和联合声明188
A.8.4 枚举191
A.8.5 声明符191
A.8.6 声明符的含义192
A.8.7 初始化195
A.8.8 类型名197
A.8.9 typedef198
A.8.10 类型等价199
A.9 语句199
A.9.1 带标号语句199
A.9.2 表达式语句199
A.9.3 复合语句200
A.9.4 选择语句200
A.9.5 循环语句201
A.9.6 跳转语句201
A.10 外部声明202
A.10.1 函数定义202
A.10.2 外部声明204
A.11 作用域与连接204
A.11.1 词法作用域205
A.11.2 连接205
A.12 预处理205
A.12.1 三字符序列206
A.12.2 行连接206
A.12.3 宏定义和扩展206
A.12.4 文件包含208
A.12.5 条件编译209
A.12.6 行控制210
A.12.7 错误信息生成210
A.12.8 pragma210
A.12.9 空指令210
A.12.10 预定义名字211
A.13 语法211
附录B 标准库