C语言教程(原书第4版)
作者 : Al Kelley, Ira Pohl
译者 : 徐波
丛书名 : 计算机科学丛书
出版日期 : 2006-12-09
ISBN : 7-111-20213-9
定价 : 45.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 423
开本 : 16开
原书名 : A Book on C: Programming in C, Fourth Edition
原出版社: Addison-Wesley
属性分类: 教材
包含CD :
绝版 :
图书简介

本书是ANSI C程序设计语言的最畅销的教材和参考书之一,完整描述了ANSI C语言及其语法特性,并对C语言的高级特性和应用作了深入阐述。作者通过循序渐进地解析程序代码,阐明了C语言结构的正确使用和语法,并揭示出其应用的基础逻辑。全书阐述清晰、层次分明,提供了大量示例和练习帮助读者深入理解书中讲解的每个概念,是一本全面论述C语言的权威著作。初学者和专业程序员都可以从本书受益。

本书特点:
  ●结合大量示例描述C语言的重要特征,完整地介绍了C语言特性。
  ●包括面向对象程序设计的重要概念,介绍了从C到Java的过渡方法。
  ●注重函数模型的使用。
  ●用表格的形式列出C的关键函数和特征,方便参考。
  ●讨论了诸如枚举类型、联合、自引用的结构以及不规则数组等高级数据结构特性。
  ●探讨了有关文件结构和系统函数的一些知识。
  ●提供的示例代码涉及统计、文本操纵、文件处理和游戏等方面。
  ●练习题包含了对正文的论证和延伸,可加深对基本概念的理解。

图书特色

图书前言

本书详细介绍了C这种通用的编程语言,既显示了C“简单即是美”的优雅特性,又展现了它“深入底层”的强大功能。本书通过详细探讨许多来自应用领域的交互式运行程序,深入描述了ANSI版本的C语言。本书一步一步地对C语言进行了完整的描述;另外,还提供了许多完整的工作程序。
  在适当的时候,我们会讨论传统C和ANSI C的不同之处(传统C仍然被广泛使用)。本书通过大量的例子,对每个重要的语言特性进行阐述。此外,还以表格形式对C的关键信息进行总结,便于读者以后参考。每一章在结束的时候都有总结和练习部分。总结部分对该章所讨论的一些关键概念进行概括,而练习部分则是对正文的论证和延伸。
  本书从通用编程语言的角度对C语言进行描述。它可以作为读者学习编程语言的入门课程;也可以作为进一步学习C语言的高级课程;还可以与比较式编程语言、计算语言学、数据结构、数据库系统、分形几何、图形学、数值分析、操作系统、编程方法学以及科学应用程序等课程一起学习。C适用于编写上述领域的应用程序,本书解释了编写这些应用程序所需要的所有特性。本书也可以作为数据结构课程的教材,因为它讨论了枚举类型、联合、自引用等结构以及不规则数组等高级数据结构特性。作为与UNIX或Windows 95/NT相关的操作系统课程,本书探讨了有关文件结构和系统函数的一些知识,使程序员能对原有的系统函数库进行添加,并理解与操作系统相关的底层C代码。对于应用程序和科学应用编程,本书介绍了如何编写示例函数库。本书所提供的工作代码还涉及统计、求方程式的根、排序、文本操纵、文件处理和游戏等内容。
  新增的Java内容
  在第14章中,我们讨论了C程序员可以很自然和很方便地用Java进行编程的原因。Java是一种适合在Internet上运行的语言,它借鉴了C和C++的许多思想,并按照一种独立于机器和系统的方式运行。这使它特别适合在Internet上运行,例如编写由浏览器所使用的在Web页面上运行的Applet。由于Java是对C和C++的扩展,因此C程序员很乐意学习Java语言。
  完整的ANSI C语言
  计算机专业人员可以在本书中找到C语言的所有主题,包括枚举类型、列表处理和操作系统接口。第1章对这门语言进行了总览性描述。在阅读了这一章之后,有编程基础的读者就可以编写C代码了。由于本书各章的内容相对独立,因此编程基础较扎实的读者可以根据需要阅读特定的章节。第11章详细讨论了C语言与操作系统的连接,这些内容可以帮助系统程序员在MS-DOS和UNIX下用C进行编程。
  交互性环境
  本书充分利用了现代计算机的交互性环境。我们在本书中始终鼓励读者进行试验。键盘和屏幕是常规的输入/输出设备,但本书也对其他的输入输出途径进行了解释。因此,本书既适用于小型的家用和商用计算机用户,也适用于大型交互性系统的用户。我们假定读者可以使用交互性的ANSI C系统。在编写本书期间,我们使用了一些不同的C系统:在IBM兼容的奔腾机器上运行的各种Borland和Microsoft编译器,GNU的gcc编译器,运行于DEC、SGI、Sun等工作站的本地编译器以及运行于San Diego的Cray大型机上的C编译器。
  工作代码
  我们通过示例程序、解释和语法来描述C语言。本书使用了大量的工作代码,通过许多小而有用的例子对一些重要的概念进行描述。之所以使用小型代码,是为了更容易让读者理解。之所以说这些小例子非常有用,是因为总是可以将程序分解为层次式的基本构件。本书所描述的程序和函数可以在实际的系统中使用。作者所信奉的哲学是读者应该不断进行试验,并从中享受乐趣。
  分析
  本书采用“分析”段落,对所提供的许多程序和函数进行详细的分析。这种分析方法是作者最初于1984年创造的,这是一种独一无二的教学方法,用于说明工作代码的一些关键特性。这种分析方法类似于对代码进行结构化的走查,目的是向读者解释新接触的编程元素以及工作代码中所出现的惯用法。
  灵活的组织
  本书的组织形式非常灵活。第1章分为两个部分:第一部分解释了实现交互性输入/输出所需要的关键编程技巧,这些内容是必须理解的;第1章的第二部分是对整个语言的总览性介绍。对于那些已经熟悉其他类似编程语言的读者,在阅读了这些内容之后,很容易了解C语言的概貌。对于初学编程的读者,第二部分可以推迟阅读。警告:初学者应该推迟第1章第二部分的学习。
  第2章在词法层次上对C语法进行描述,讨论了C的语法规则。该章选择性地使用了一些语法规则来显示C语言的结构。对于第2章所描述的Backus-Naur-Form(BNF巴克斯-诺尔形式)记法,读者可以选择完全将其略过,这并不会对学习的连续性造成任何影响。本书使用了BNF风格的语法描述,使读者可以了解标准的编程语言描述形式。另外,本书通过示例程序和解释对语言的成分进行详细的描述。
  参考作用
  本书可以作为C语言的参考手册。本书提供了许多表格,简洁地总结了C语言的一些关键概念。附录A描述了完整的ANSI C标准函数库以及相关的头文件。附录A的内容是根据标准头文件组织的,例如ctype.h、stdio.h和string.h等。在适当的时候,我们会提供示例代码说明某个特定结构或特定函数的用法。
在附录B中,我们提供了C语言的完整语法。在附录C中,我们讨论了ANSI C和传统C的一些主要区别。
  完整的语法特性
  第3章到第10章对C语言的各个特性进行了完整的介绍。其中包括了许多高级话题,读者在第一遍阅读时可以将它们省略,这样并不会对接下来的学习产生影响。例如,读者在第一遍阅读本书时可以忽略枚举类型的介绍。本书强调了像字长和浮点表示形式等依赖于机器的特性,但初学者可以忽略这些细节。
  预处理器
  第8章完整地讲述了预处理器,它用于对C语言的功能和概念进行扩展。宏可以用于生成内联代码,可以代替函数调用。使用宏可以减少程序的执行时间。该章对预处理器进行了详细的描述,包括ANSI C委员会所增加的一些新特性。在传统C中,预处理器在不同的编译器中可能具有显著的差别。在ANSI C中,预处理器的功能完全是预先指定的。
  递归和列表处理
  第5章对递归进行了详细讨论。递归这个概念对于初学者而言常常显得颇为神秘。第8章在讨论快速排序算法时以及第10章在讨论基本的列表处理技巧时再次说明了递归的用法。要完整地理解列表处理技巧,读者需要学习高级编程和数据结构课程。
  与操作系统连接
  第11章讨论了C语言和操作系统的连接。在该章中,我们解释了如何进行文件处理,并详细介绍了标准函数库中的各个输入/输出函数。我们还解释了如何在C程序中执行系统命令,如何设置文件访问权限以及如何使用环境变量。我们提供了一些例子,说明了性能评估程序、函数库管理工具以及make工具的用法。
  高级应用
  在第12章中,我们讨论了C语言的一些高级应用。我们讨论了诸如并发进程的创建、叠加进程、进程间通信以及信号等话题,并提供了一些工作代码。另外,我们还讨论了向量和矩阵的动态内存分配,这些知识工程师和科学家会用到。读者可以根据需要选择性地使用这些高级技巧,它们可以作为高级编程实践的基础。本书也可以作为以C为实现语言的高级计算机科学课程的辅导书。
  表格、总结和练习
  在本书中,我们用许多表格对C语言的一些关键概念进行总结。这些表格可以帮助读者加深对C语言的理解。例如,C具有大量的操作符,并且几乎允许操作符进行各种类型的混合使用。理解这些操作符的优先级和结合性是非常重要的,它有助于理解各种混合表达式的求值顺序。本书中的很多表格就是对各种混合表达式的求值顺序进行分析。作为参考手册,这些表格和代码很容易寻找。
  练习部分是对语言的基本元素进行测试,并讨论了一些高级的以及因系统而异的特性。许多练习的目的是为了解决问题,还有些练习则是测试读者对C的语法或语义的理解。有些练习所讨论的主题是对正文的补充,有些读者可能会对它们产生兴趣。本书的练习提供了难易程度各异的问题,适合各个层次的读者。

封底文字

本书是ANSI C程序设计语言的最畅销的教材和参考书之一,完整描述了ANSI C语言及其语法特性,并对C语言的高级特性和应用作了深入阐述。作者通过循序渐进地解析程序代码,阐明了C语言结构的正确使用和语法,并揭示出其应用的基础逻辑。全书阐述清晰、层次分明,提供了大量示例和练习帮助读者深入理解书中讲解的每个概念,是一本全面论述C语言的权威著作。初学者和专业程序员都可以从本书受益。 本书特点: ●结合大量示例描述C语言的重要特征,完整地介绍了C语言特性。 ●包括面向对象程序设计的重要概念,介绍了从C到Java的过渡方法。 ●注重函数模型的使用。 ●用表格的形式列出C的关键函数和特征,方便参考。 ●讨论了诸如枚举类型、联合、自引用的结构以及不规则数组等高级数据结构特性。 ●探讨了有关文件结构和系统函数的一些知识。 ●提供的示例代码涉及统计、文本操纵、文件处理和游戏等方面。 ●练习题包含了对正文的论证和延伸,可加深对基本概念的理解。

作者简介

Al Kelley, Ira Pohl:Ira Pohl: 是美国加州大学圣克鲁兹分校计算机科学技术系教授,具有20多年软件教学经验,是C和C++程序设计语言的国际权威,著有多部与C和C++语言有关的经典著作(其中,《C++精粹》和《C语言解析教程》已经由机械工业出版社翻译出版)。他曾为多家机构提供技术咨询服务,包括DEC公司、苹果公司、斯坦福线形加速器研究中心、Xylinx和Gupta公司等。

译者简介

徐波:徐波: 浙江宁波人,熟悉C、C++和Java语言,尤以C和C++见长。主要译作有《C专家编程》、《C和指针》、《OpenGL编程指南 (原书第5版)》等。 徐波的blog是 http://blog.csdn.net/ThinkAcute。

图书目录

第0章  从零开始 1
0.1  为什么要用C 1
0.2  ANSI C标准 2
0.3  从C到C++ 2
0.4  从C和C++到Java 3
第1章  C语言概述 5
1.1  编程和预备知识 5
1.2  程序输出 5
1.3  变量、表达式和赋值 8
1.4  使用#define和#include 10
1.5  使用printf()和scanf() 12
1.6  控制流 14
1.7  函数 19
1.8  数组、字符串和指针 23
1.8.1  数组 23
1.8.2  字符串 25
1.8.3  指针 27
1.9  文件 29
1.10  与操作系统有关的内容 33
1.10.1  编写和运行C程序 33
1.10.2  中断程序 35
1.10.3  输入文件尾标志 35
1.10.4  输入和输出的重定向 35
1.11  总结 36
1.12  练习 37
第2章  词法元素、操作符和C系统 43
2.1  字符和词法元素 43
2.2  语法规则 45
2.3  注释 46
2.4  关键字 47
2.5  标识符 48
2.6  常量 49
2.7  字符串常量 49
2.8  操作符和标点符号 50
2.9  操作符的优先级和结合性 51
2.10  增值操作符和减值操作符 52
2.11  赋值操作符 53
2.12  例子:计算2的乘方 54
2.13  C系统 55
2.13.1  预处理器 55
2.13.2  标准函数库 56
2.14  总结 58
2.15  练习 59
第3章  基本数据类型 65
3.1  声明、表达式和赋值 65
3.2  基本数据类型 66
3.3  字符和char数据类型 67
3.4  int数据类型 70
3.5  整数类型short、long和unsigned 71
3.6  浮点类型 72
3.7  typedef的用法 74
3.8  sizeof操作符 74
3.9  使用getchar()和putchar() 75
3.10  数学函数 77
3.10.1  使用abs()和fabs() 78
3.10.2  UNIX和数学函数库 79
3.11  隐式类型转换和强制类型转换 79
3.11.1  整型提升 79
3.11.2  寻常算术转换 79
3.11.3  强制类型转换 81
3.12  十六进制和八进制常量 81
3.13  总结 83
3.14  练习 84
第4章  控制流 89
4.1  关系操作符、相等操作符和逻辑操作符 89
4.2  关系操作符和表达式 90
4.3  相等操作符和表达式 92
4.4  逻辑操作符和表达式 93
4.5  复合语句 95
4.6  表达式和空语句 95
4.7  if和if-else语句 96
4.8  while语句 98
4.9  for语句 100
4.10  例子:布尔变量 102
4.11  逗号操作符 102
4.12  do语句 103
4.13  例子:斐波那契数 105
4.14  goto语句 107
4.15  break和continue语句 108
4.16  switch语句 108
4.17  条件操作符 109
4.18  总结 110
4.19  练习 111
第5章  函数 119
5.1  函数定义 119
5.2  return语句 121
5.3  函数原型 121
5.4  例子:创建乘方表 122
5.5  从编译器的角度观察函数原型 123
5.6  函数定义顺序的另一种风格 124
5.7  函数调用和传值调用 125
5.8  开发大型程序 126
5.9  使用断言 128
5.10  作用域规则 129
5.10.1  平行和嵌套代码块 130
5.10.2  以调试为目的使用代码块 130
5.11  存储类型 130
5.11.1  auto存储类型 130
5.11.2  extern存储类型 131
5.11.3  register存储类型 132
5.11.4  static存储类型 133
5.12  静态外部变量 133
5.13  默认初始化 134
5.14  递归 135
5.15  例子:汉诺塔 138
5.16  总结 141
5.17  练习 142
第6章  数组、指针和字符串 149
6.1  一维数组 149
6.1.1  初始化 150
6.1.2  下标 150
6.2  指针 151
6.3  传引用调用 153
6.4  数组和指针之间的关系 154
6.5  指针运算和元素的大小 155
6.6  数组作为函数的实参 156
6.7  例子:冒泡排序 156
6.8  用calloc()和malloc()进行动态内存分配 157
6.9  例子:归并和归并排序 160
6.10  字符串 164
6.11  标准函数库中的字符串处理函数 165
6.12  多维数组 168
6.12.1  二维数组 168
6.12.2  存储映射函数 169
6.12.3  形式参数声明 169
6.12.4  三维数组 170
6.12.5  初始化 170
6.12.6  使用typedef 171
6.13  指针数组 172
6.14  main()函数的参数 176
6.15  不规则数组 176
6.16  函数作为参数 178
6.17  例子:使用二分法寻找函数的根 180
6.18  函数指针数组 183
6.19  类型限定符const和volatile 186
6.20  总结 187
6.21  练习 188
第7章  位操作符和枚举类型 201
7.1  位操作符和表达式 201
7.1.1  按位求反 202
7.1.2  补码 202
7.1.3  位逻辑操作符 203
7.1.4  左移位和右移位操作符 203
7.2  掩码 204
7.3  软件工具:打印int值的二进制形式 205
7.4  包装和解包 206
7.5  枚举类型 209
7.6  例子:“石头、剪刀、布”游戏 211
7.7  总结 215
7.8  练习 216
第8章  预处理器 221
8.1  #include的使用 221
8.2  使用#define 221
8.3  带参数的宏 222
8.4  stddef.h中的类型定义和宏 224
8.5  例子:用qsort()进行排序 225
8.6  例子:带参数的宏 228
8.7  stdio.h和ctype.h中的宏 231
8.8  条件编译 232
8.9  预定义的宏 234
8.10  “#”和“##”操作符 234
8.11  assert()宏 235
8.12  使用#error和#pragma 235
8.13  行号 236
8.14  对应的函数 236
8.15  例子:快速排序 236
8.16  总结 238
8.17  练习 239
第9章  结构和联合 247
9.1  结构 247
9.2  访问结构成员 249
9.3  操作符的优先级和结合性的总结 251
9.4  在函数中使用结构 252
9.5  结构的初始化 253
9.6  例子:玩扑克牌 254
9.7  联合 257
9.8  位字段 259
9.9  例子:访问位和字节 260
9.10  ADT堆栈 261
9.11  总结 264
9.12  练习 265
第10章  结构和列表处理 271
10.1  自引用的结构 271
10.2  线性链表 272
10.3  链表操作 273
10.4  一些链表处理函数 275
10.4.1  插入 277
10.4.2  删除 277
10.5  堆栈 278
10.6  例子:波兰记法和堆栈求值 280
10.7  队列 285
10.8  二叉树 287
10.8.1  二叉树的遍历 288
10.8.2  创建树 290
10.9  普通的树 290
10.9.1  遍历 292
10.9.2  calloc()的用法以及树的创建 292
10.10  总结 293
10.11  练习 294
第11章  输入/输出和操作系统 299
11.1  输出函数printf() 299
11.2  输入函数scanf() 302
11.3  fprintf()、fscanf()、sprintf()和sscanf()函数 305
11.4  fopen()和fclose()函数 306
11.5  例子:对文件进行空间加倍 307
11.6  使用临时文件和优雅函数 309
11.7  随机访问文件 311
11.8  文件描述符输入/输出 312
11.9  文件访问权限 313
11.10  在C程序内部执行命令 314
11.11  在C程序内部使用管道 315
11.12  环境变量 316
11.13  C编译器 316
11.14  使用性能评估程序 318
11.15  函数库 319
11.16  对C代码进行计时 320
11.17  使用make 323
11.18  使用touch 327
11.19  其他有用的工具 327
11.20  总结 328
11.21  练习 329
第12章  高级应用 337
12.1  用fork()创建并发进程 337
12.2  进程的叠加:exec...()函数族系 338
12.3  使用pipe()实现进程间的通信 340
12.4  信号 342
12.5  例子:哲学家用餐问题 344
12.6  矩阵的动态分配 346
12.6.1  为什么二维数组无法满足要求 346
12.6.2  用指针数组创建矩阵 347
12.6.3  调整下标范围 348
12.6.4  一次分配所有内存 350
12.7  返回状态 351
12.8  总结 354
12.9  练习 355
第13章  从C到C++ 359
13.1  输出 359
13.2  输入 360
13.3  函数 362
13.4  类和抽象数据类型 363
13.5  重载 364
13.6  构造函数和析构函数 366
13.7  面向对象编程和继承 367
13.8  多态 368
13.9  模板 370
13.10  C++的异常 371
13.11  面向对象编程的优点 371
13.12  总结 372
13.13  练习 373
第14章  从C到Java 377
14.1  输出 377
14.2  变量和类型 378
14.3  类和抽象数据类型 379
14.4  重载 380
14.5  类的创建和销毁 380
14.6  面向对象编程和继承 381
14.7  多态和重写方法 381
14.8  Applet 382
14.9  Java的异常 383
14.10  Java和OOP的优势 384
14.11  总结 384
14.12  练习 385
附录A  标准函数库 387
附录B  C的语法 413
附录C  ANSI C与传统C的比较 419
附录D  ASCII字符码 424
附录E  操作符的优先级和结合性 425

教学资源推荐
作者: [美]本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著
作者: [美]克洛维斯· L.汤多(Clovis L. Tondo) 斯科特· E.吉姆佩尔(Scott E. Gimpel)著
作者: 钱丽萍 汪立东 张健 编著
参考读物推荐
作者: 刘志铭 杨丽 等编著
作者: Andre Lewis Michael Purvis;Jeffrey Sambells Cameron Turner