编辑推荐
《C语言程序设计:现代方法(第2版)》是C语言的经典之作,被誉为“近10年来的一部C语言著作”。书中讨论了标准C和C标准库的全部特性,包括信号、setjmp/longjmp和可变参数列表等其他书中很少涉及的内容。《C语言程序设计:现代方法(第2版)》由易而难、循序渐进、螺旋式地讲述C语言,很好地处理了指针和位运算等难点。第2版覆盖了C99标准,并提供了对所有C99库函数的参考,还扩展了GCC的内容,增加了对抽象数据类型的讨论,并针对新CPU和操作系统做了更新。《C语言程序设计:现代方法(第2版)》尤为强调软件工程和现代编程理
内容简介
时至今日,C语言仍然是计算机领域的通用语言之一,但今天的C语言已经和初的时候大不相同了。《C语言程序设计:现代方法(第2版)》主要的一个目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了C99标准,并与C89标准进行对照,补充了C99中的全新特性。《C语言程序设计:现代方法(第2版)》分为C语言的基础特性、C语言的高级特性、C语言标准库和参考资料4个部分。每章末尾都有一个“问与答”小节给出一系列与该章内容相关的问题及答案,此外还包含适量的习题。
《C语言程序设计:现代方法(第2版)》是为大学本科阶段的C语言课程编写的教材,同时也非常适合作为其他课程的辅助用书。
作者简介
K.N.King世界知名的计算机程序设计教育家,现为佐治亚州立大学数学与计算机科学系副教授。他拥有耶鲁大学计算机科学硕士学位,加州大学伯克利分校计算机科学博士学位,曾任教于佐治亚理工学院。除《C语言程序设计:现代方法(第2版)》外,他还撰写了广受欢迎的著作Modula-2:ACompleteGuide和JavaProgramming:FromtheBeginning,并在Dr.DobbsJournal等专业杂志上发表了许多文章。业余时间,King教授还在多部电影中扮演过角色。
吕秀锋,亚洲理工大学(AIT)计算机软件硕士,现为北京理工大学软件学院教师。多年来一直从事“计算机基础(双语)”、“C语言程序设计(双语)”以及“程序设计开发与实践”等本科生课程的教学工作,深受学生欢迎。她还译有《数据结构与算法:C#语言描述》一书。
黄倩,中国科学院计算技术研究所工学博士,中国计算机学会会员。研究方向包括视频处理、视频监控等,已在知名的国际期刊和国际会议论文集上发表10篇论文。译有《编程珠玑(第2版)》一书,受到读者欢迎。
精彩书评
★“我完全沉浸在阅读的过程中,我迫切地想用这《C语言程序设计:现代方法(第2版)》作为授课教材。”
——KarenReid,多伦多大学计算机科学系资深讲师
★“我将这《C语言程序设计:现代方法(第2版)》用作工程系新生的教材。它语言简洁,阐述清晰,并且覆盖了C语言的方方面面,非常适用于初学者。“
——MaekusBussmann,多伦多大学机械工业工程系教授
★“这是我目前读到过的一本很好的C语言书籍,15年
目录
第1章C语言概述1
1.1C语言的历史1
1.1.1起源1
1.1.2标准化1
1.1.3基于C的语言2
1.2C语言的优缺点3
1.2.1C语言的优点3
1.2.2C语言的缺点3
1.2.3高效地使用C语言4
问与答5
第2章C语言基本概念7
2.1编写一个简单的C程序7
程序显示双关语7
2.1.1编译和链接8
2.1.2集成开发环境8
2.2简单程序的一般形式9
2.2.1指令9
2.2.2函数9
2.2.3语句10
2.2.4显示字符串10
2.3注释11
2.4变量和赋值12
2.4.1类型12
2.4.2声明13
2.4.3赋值13
2.4.4显示变量的值14
程序计算箱子的空间重量14
2.4.5初始化15
2.4.6显示表达式的值16
2.5读入输入16
程序计算箱子的空间重量(改进版)16
2.6定义常量的名字17
程序华氏温度转换为摄氏温度17
2.7标识符18
2.8C程序的书写规范19
问与答21
练习题23
编程题24
第3章格式化输入/输出26
3.1printf函数26
3.1.1转换说明27
程序用printf函数格式化数28
3.1.2转义序列28
3.2scanf函数29
3.2.1scanf函数的工作方法30
3.2.2格式串中的普通字符31
3.2.3易混淆的printf函数和scanf函数32
程序分数相加32
问与答33
练习题34
编程题35
第4章表达式36
4.1算术运算符36
程序计算通用产品代码的校验位38
4.2赋值运算符39
4.2.1简单赋值40
4.2.2左值41
4.2.3复合赋值41
4.3自增运算符和自减运算符42
4.4表达式求值43
4.5表达式语句45
问与答45
练习题47
编程题49
第5章选择语句50
5.1逻辑表达式50
5.1.1关系运算符50
5.1.2判等运算符51
5.1.3逻辑运算符51
5.2if语句52
5.2.1复合语句53
5.2.2else子句53
5.2.3级联式if语句54
程序计算股票经纪人的佣金55
5.2.4“悬空else”的问题56
5.2.5条件表达式57
5.2.6C89中的布尔值58
5.2.7C99中的布尔值58
5.3switch语句59
程序显示法定格式的日期61
问与答62
练习题65
编程题67
第6章循环69
6.1while语句69
程序显示平方表71
程序数列求和71
6.2do语句72
程序计算整数的位数73
6.3for语句73
6.3.1for语句的惯用法74
6.3.2在for语句中省略表达式75
6.3.3C99中的for语句75
6.3.4逗号运算符76
程序显示平方表(改进版)77
6.4退出循环78
6.4.1break语句78
6.4.2continue语句78
6.4.3goto语句79
程序账簿结算80
6.5空语句81
问与答83
练习题84
编程题85
第7章基本类型88
7.1整数类型88
7.1.1C99中的整数类型90
7.1.2整数常量90
7.1.3C99中的整数常量91
7.1.4整数溢出91
7.1.5读/写整数91
程序数列求和(改进版)92
7.2浮点类型93
7.2.1浮点常量94
7.2.2读/写浮点数94
7.3字符类型94
7.3.1字符操作95
7.3.2有符号字符和无符号字符95
7.3.3算术类型96
7.3.4转义序列96
7.3.5字符处理函数97
7.3.6用scanf和printf读/写字符98
7.3.7用getchar和putchar读/写字符98
程序确定消息的长度99
7.4类型转换100
7.4.1常用算术转换101
7.4.2赋值过程中的转换102
7.4.3C99中的隐式转换103
7.4.4强制类型转换103
7.5类型定义105
7.5.1类型定义的优点105
7.5.2类型定义和可移植性105
7.6sizeof运算符106
问与答107
练习题109
编程题110
第8章数组113
8.1一维数组113
8.1.1数组下标113
程序数列反向115
8.1.2数组初始化115
8.1.3指定初始化式116
程序检查数中重复出现的数字116
8.1.4对数组使用sizeof运算符117
程序计算利息118
8.2多维数组119
8.2.1多维数组初始化120
8.2.2常量数组121
程序发牌121
8.3C99中的变长数组122
问与答123
练习题124
编程题125
第9章函数129
9.1函数的定义和调用129
程序计算平均值129
程序显示倒计数130
程序显示双关语(改进版)131
9.1.1函数定义132
9.1.2函数调用133
程序判定素数134
9.2函数声明135
9.3实际参数136
9.3.1实际参数的转换137
9.3.2数组型实际参数138
9.3.3变长数组形式参数140
9.3.4在数组参数声明中使用static141
9.3.5复合字面量141
9.4return语句142
9.5程序终止143
9.6递归144
程序快速排序146
问与答147
练习题150
编程题153
第10章程序结构155
10.1局部变量155
10.1.1静态局部变量156
10.1.2形式参数156
10.2外部变量156
10.2.1示例:用外部变量实现栈156
10.2.2外部变量的利与弊157
程序猜数158
10.3程序块161
10.4作用域162
10.5构建C程序163
程序给一手牌分类163
问与答169
练习题169
编程题170
第11章指针172
11.1指针变量172
11.2取地址运算符和间接寻址运算符173
11.2.1取地址运算符173
11.2.2间接寻址运算符174
11.3指针赋值174
11.4指针作为参数176
程序找出数组中的最大元素和最小元素177
11.5指针作为返回值179
问与答180
练习题181
编程题182
第12章指针和数组184
12.1指针的算术运算184
12.1.1指针加上整数185
12.1.2指针减去整数185
12.1.3两个指针相减186
12.1.4指针比较186
12.1.5指向复合常量的指针186
12.2指针用于数组处理186
12.3用数组名作为指针188程序数列反向(改进版)189
12.3.1数组型实际参数(改进版)189
12.3.2用指针作为数组名191
12.4指针和多维数组191
12.4.1处理多维数组的元素191
12.4.2处理多维数组的行192
12.4.3处理多维数组的列192
12.4.4用多维数组名作为指针192
12.5C99中的指针和变长数组193
问与答194
练习题195
编程题197
第13章字符串198
13.1字符串字面量198
13.1.1字符串字面量中的转义序列198
13.1.2延续字符串字面量199
13.1.3如何存储字符串字面量199
13.1.4字符串字面量的操作200
13.1.5字符串字面量与字符常量200
13.2字符串变量200
13.2.1初始化字符串变量201
13.2.2字符数组与字符指针202
13.3字符串的读和写203
13.3.1用printf函数和puts函数写字符串203
13.3.2用scanf函数和gets函数读字符串203
13.3.3逐个字符读字符串204
13.4访问字符串中的字符205
13.5使用C语言的字符串库206
13.5.1strcpy函数207
13.5.2strlen函数208
13.5.3strcat函数208
13.5.4strcmp函数209程序显示一个月的提醒列表209
13.6字符串惯用法211
13.6.1搜索字符串的结尾211
13.6.2复制字符串213
13.7字符串数组214
程序核对行星的名字217
问与答218
练习题220
编程题222
第14章预处理器225
14.1预处理器的工作原理225
14.2预处理指令227
14.3宏定义227
14.3.1简单的宏227
14.3.2带参数的宏229
14.3.3#运算符231
14.3.4##运算符231
14.3.5宏的通用属性232
14.3.6宏定义中的圆括号233
14.3.7创建较长的宏233
14.3.8预定义宏234
14.3.9C99中新增的预定义宏235
14.3.10空的宏参数236
14.3.11参数个数可变的宏236
14.3.12__func__标识符237
14.4条件编译237
14.4.1#if指令和#endif指令238
14.4.2defined运算符238
14.4.3#ifdef指令和#ifndef指令239
14.4.4#elif指令和#else指令239
14.4.5使用条件编译240
14.5其他指令240
14.5.1#error指令240
14.5.2#line指令241
14.5.3#pragma指令242
14.5.4_Pragma运算符242
问与答243
练习题245
第15章编写大型程序248
15.1源文件248
15.2头文件249
15.2.1#include指令249
15.2.2共享宏定义和类型定义250
15.2.3共享函数原型251
15.2.4共享变量声明252
15.2.5嵌套包含253
15.2.6保护头文件253
15.2.7头文件中的#error指令254
15.3把程序划分成多个文件254程序文本格式化255
15.4构建多文件程序260
15.4.1makefile260
15.4.2链接期间的错误262
15.4.3重新构建程序262
15.4.4在程序外定义宏264
问与答264
练习题265
编程题266
第16章结构、联合和枚举267
16.1结构变量267
16.1.1结构变量的声明267
16.1.2结构变量的初始化269
16.1.3指定初始化269
16.1.4对结构的操作270
16.2结构类型270
16.2.1结构标记的声明271
16.2.2结构类型的定义272
16.2.3结构作为参数和返回值272
16.2.4复合字面量273
16.3嵌套的数组和结构274
16.3.1嵌套的结构274
16.3.2结构数组274
16.3.3结构数组的初始化275程序维护零件数据库275
16.4联合281
16.4.1用联合来节省空间282
16.4.2用联合来构造混合的数据结构284
16.4.3为联合添加“标记字段”284
16.5枚举285
16.5.1枚举标记和类型名286
16.5.2枚举作为整数286
16.5.3用枚举声明“标记字段”286
问与答287
练习题289
编程题293
第17章指针的高级应用294
17.1动态存储分配294
17.1.1内存分配函数294
17.1.2空指针295
17.2动态分配字符串296
……
第18章声明327
第19章程序设计345
第20章底层程序设计363
第21章标准库377
第22章输入/输出384
第23章库对数值和字符数据的支持419
第24章错误处理446
第25章国际化特性456
第26章其他库函数482
第27章C99对数学计算的新增支持503
附录AC语言运算符524
附录BC99与C89的比较525
附录CC89与经典C的比较529
附录D标准库函数532
附录EASCII字符集569
参考文献570
索引573精彩书摘
C语言的输入/输出库是标准库中最大且最重要的部分。由于输入/输出是C语言的高级应用,因此这里将用一整章(《C语言程序设计:现代方法(第2版)》中最长的一章)来讨论头——输入/输出函数存放的主要地方。
从第2章开始,我们已经在使用了,而且已经对printf函数、scanf函数、putchar函数、getchar函数、puts函数以及gets函数的使用有了一定的了解。本章会提供更多有关这6个函数的信息,并介绍一些新的用于文件处理的函数。值得高兴的是,许多新函数和我们已经熟知的函数有着紧密的联系。例如,printf函数就是printf函数的“文件版”。
本章的开始将会讨论一些基本问题:流的概念、FILE类型、输入和输出重定向以及文本文件和二进制文件的差异(22.1节)。随后将转入讨论特别为使用文件而设计的函数,包括打开和关闭文件的函数(22.2节)。在讨论完printf函数、scanf函数以及与“格式化”输入/输出相关的函数(22.3节)以后,我们将着眼于读/写非格式化数据的函数。
·每次读写一个字符的getc函数、putc函数以及相关的函数(22.4节)。
·每次读写一行字符的gets函数、puts函数以及相关的函数(22.5节)。
·读/写数据块的fread函数和fwri七e函数(22.6节)。随后,22.7节会说明如何对文件上执行随机的访问操作。最后,22.8节会描述sprintf函数、snpr·intf函数和sscanf函数,它们是printf函数和scan£函数的变体,后两者分别用于写入和读取一个字符串。
本章涵盖了中的绝大部分函数,但忽略了其中8个函数。perror函数是这8个函1数中的一个,它与头紧密相关,所以我把它推迟到24.2节讨论头时进行介绍。26.1节涵盖了其余7个函数(vfprintf、vprintf、vsprintf、vsnprintf、vfscanf、vscanf和vsscanf)。这些函数依赖于valist类型,该类型在26.1节介绍。
在C89r扣,所有的标准输入/输出函数都属于但C99有所不同,有些输入/输出函数在.头(25.5节)中声明。中的函数用于处理宽字符而不是普通字符,但大多数函数与中的函数紧密相关。中用于读或写数据的函数称为宇节输入/输出函数,而中的类似函数则称为宽字符输入/输出函数。前言/序言
在计算领域中,把显而易见的转变为有实用价值的,这一过程是“挫折”一词的生动体现。
自《C语言程序设计:现代方法(第2版)》第1版出版以来,基于C的语言大量兴起(其中最杰出的代表是Java和C#),已有的C++和Perl等相关语言也取得了更大的成就。尽管如此,C语言仍然像当年一样流行,仍然悄无声息地掌控着世界上的许多软件。跟1996年一样,C语言仍然是计算机领域里的通用语言。
但即便是C语言也必须随着时间而发展。C99标准的发布催生了对《C语言程序设计:现代方法(第2版)》新版的需求,而且,第1版涉及的DOS和16位处理器也已经趋于过时。本版对内容进行了全面更新,并在其他许多方面进行了改进。
本版新增内容
下面列出了本版的新特色和所做的改进。
完整地覆盖了C89标准和C99标准。本版和第1版最大的差别就在于覆盖了C99标准。我的目标是覆盖C89和C99之间的每一个重要差别,包括C99新增的所有语言特性和库函数。C99中的每一处改变都会清楚地标出来,或者在小节标题中加上“C99”字样,或者在讨论比较简短时在正文的左边空白处用一个专门的图标表示。我这样做有两个目的:一是提醒读者注意C99中的改变,二是让那些对C99不感兴趣或没有C99编译器的读者知道哪些内容可以跳过。C99新增的许多内容可能只有特定的读者会感兴趣,但有些新特性几乎对所有的C程序员都有用。
提供了对所有C89和C99库函数的快速参考。第1版中附录D介绍了C89的所有标准库函数,本版的附录D给出了C89和C99的所有库函数。
扩展了GCC的内容。自《C语言程序设计:现代方法(第2版)》第1版出版以来,GCC(最初是GNUCCompiler的简称,现在指GNUCompilerCollection)得到了广泛应用。GCC有很多优点,包括高性能、低成本(不用花钱)以及在众多软硬件平台之间的可移植性等。由于认识到GCC日渐重要,我在本版中介绍了更多与GCC相关的信息,包括如何使用GCC以及常见的GCC错误消息和警告。
增加了对抽象数据类型的讨论。在第1版中,第19章重点讨论了C++。这部分内容现在看起来似乎作用不大,因为《C语言程序设计:现代方法(第2版)》的读者可能已经学过C++、Java或者C#了。在本版中,对C++的介绍替换为讨论如何在C中建立抽象数据类型。
扩展了国际化特性的内容。本版第25章更加详尽地讨论了C语言的国际化特性。重点扩展了Unicode字符集及编码。
针对CPU和操作系统做了更新。当我编写《C语言程序设计:现代方法(第2版)》第1版时,许多读者用的还是16位机和DOS操作系统,但现在情况不同了。在本版中,我把讨论的重点放在32位机和64位机上。尽管本版也介绍了Windows和MacOS操作系统中影响C程序员的方面,但是针对Linux和其他UNIX版本的出现,我们的讨论更侧重于后一个系列的操作系统。