您好,欢迎来到聚文网。 登录 免费注册
C语言程序设计 现代方法 第2版·修订版

C语言程序设计 现代方法 第2版·修订版

  • 字数: 1273000
  • 装帧: 平装
  • 出版社: 人民邮电出版社
  • 作者: (美)K.N.金 著 吕秀锋,黄倩 译
  • 出版日期: 2021-07-01
  • 商品条码: 9787115565198
  • 版次: 2
  • 开本: 16开
  • 页数: 696
  • 出版年份: 2021
定价:¥129.8 销售价:登录后查看价格  ¥{{selectedSku?.salePrice}} 
库存: {{selectedSku?.stock}} 库存充足
{{item.title}}:
{{its.name}}
精选
编辑推荐
1.近30年来C语言入门教程,累计印数10万+,豆瓣评分9.3分 2.C开发人员的理想参考书,哈佛、麻省理工、斯坦福等诸多名校C语言教材 3.第二版修订版基于C1X标准新升级,增加了C11和C18中的内容,同时章末包含大量习题供读者练习 4.书中讨论了各种实际的环境和使用场景,包括Windows、UNIX和Linux等 5.浙江大学教授翁恺、哈尔滨工业大学教授苏小红、Boolan咨询师吴咏炜、Linux专家宋宝华联合推荐 C语言已经有近50年的历史了。在中国,超过95%的大学用C语言作为入门编程语言,但也因此把C语言当作一种学习编程的教学媒介语言来教,使得学生只学到了其中的基础部分,而对C语言近30年的发展及其在工业中的应用所知甚少。本书是难得的真正讲述C语言的教材,覆盖了C99、C11、C18标准的内容。本书非常适合今后会用C语言来做嵌入式系统、设备驱动和操作系统等产品开发的人士学习。在浙江大学,我们在工程实践课程中使用了本书的上一个版本,收获了良好的教学效果。 ——翁恺,浙江大学计算机学院教授 书如其名,本书以一种崭新的视角和通俗易懂的方式,来向读者介绍C语言的“现代方法”,聚焦程序设计的核心问题和方法,给C语言这门经久不衰、老而弥坚的语言赋予了崭新的面貌。本书介绍了C99和C1X的许多新特性,而且编排方式方便读者查阅。本书用现代的视角来解读C语言,每章后面的“问与答”也很贴心,适时地解答了读者在阅读过程中可能会遇到的很多疑难问题。本书内容特别适合具备一定语言基础,想深入了解C语言精髓的读者,我相信这本书一定会受到读者的欢迎,成为C语言爱好者提升内功的一本武林秘笈。 ——苏小红,哈尔滨工业大学教授、博士生导师,省级教学名师 本书讨论了C语言的所有特性,从C89一直贯穿到C18。内容足够新,也足够全面,这就是它的突出特色。 ——吴咏炜,Boolan首席咨询师 本书是C语言程序设计的经典图书,本次修订版增加了C1X的内容,并就C1X与之前的C89、C99进行了比对,做到了与时俱进。本书更是新增了第28章,重点介绍了C1X的多线程特性,相信对读者会有巨大的帮助。读者通过阅读本书,可深入理解C89、C99和C1X的演进,并进一步思考C语言为什么这么演进,这对提高自身的思维能力以及对软件工程问题的认知都会有帮助。 ——宋宝华,资深Linux专家
内容简介
时至今日,C语言仍然是计算机领域的通用语言之一,但今天的C语言已经和最初的时候大不相同了。本书主要目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化”。第2版修订版中不仅有C99中的新特性,还与时俱进地增加了C11和C18中的内容。本书分为C语言的基础特性、C语言的高级特性、C语言标准库和参考资料4个部分。每章末尾的“问与答”部分给出一系列与该章内容相关的问题及答案,此外还包含适量的习题。本书是C开发人员的理想参考书,在国外也被众多大学作为C语言课程的教材。
作者简介
【作者简介】 K. N. 金(K. N. King) 世界知名的计算机程序设计教育家。他拥有耶鲁大学计算机科学硕士学位,加州大学伯克利分校计算机科学博士学位,曾任教于佐治亚理工学院和佐治亚州立大学。除本书外,他还撰写了广受欢迎的著作Modula-2: A Complete Guide和Java Programming: From the Beginning。 【译者简介】 吕秀锋 曾任教于北京理工大学软件学院,讲授过多门计算机课程,包括“计算机基础(双语)”“C语言程序设计(双语)”“数据结构”“程序设计开发与实践”。 黄倩 河海大学计算机科学与技术系主任,兼任中国人工智能学会深度学习专委会委员、中国计算机学会多媒体技术专委会委员。博士毕业于中国科学院计算技术研究所,译有《编程珠玑(第2版)》等。 【审校简介】 李忠 资深C语言专家。著有《穿越计算机的迷雾》《X86汇编语言:从实模式到保护模式》《C语言非常道》和《标准C语言指南》等。
目录
第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语言的缺点4
1.2.3高效地使用C语言5
问与答5
第2章 C语言基本概念7
2.1编写一个简单的C程序7
2.1.1编译和链接8
2.1.2集成开发环境9
2.2简单程序的一般形式9
2.2.1指令9
2.2.2函数9
2.2.3语句10
2.2.4显示字符串11
2.3注释11
2.4变量和赋值13
2.4.1类型13
2.4.2声明13
2.4.3赋值14
2.4.4显示变量的值15
2.4.5初始化16
2.4.6显示表达式的值17
2.5读入输入17
2.6定义常量的名字18
2.7标识符19
2.8C程序的书写规范21
问与答23
练习题25
编程题26
第3章 格式化输入/输出28
3.1printf函数28
3.1.1转换说明29
3.1.2转义序列31
3.2scanf函数31
3.2.1scanf函数的工作方法32
3.2.2格式串中的普通字符34
3.2.3易混淆的printf函数和scanf函数34
问与答35
练习题37
编程题38
第4章 表达式40
4.1算术运算符40
4.2赋值运算符44
4.2.1简单赋值44
4.2.2左值45
4.2.3复合赋值45
4.3自增运算符和自减运算符46
4.4表达式求值47
4.5表达式语句50
问与答50
练习题52
编程题54
第5章 选择语句56
5.1逻辑表达式56
5.1.1关系运算符56
5.1.2判等运算符57
5.1.3逻辑运算符57
5.2if语句58
5.2.1复合语句59
5.2.2else子句59
5.2.3级联式if语句61
5.2.4“悬空else”的问题63
5.2.5条件表达式63
5.2.6C89中的布尔值64
5.2.7C99中的布尔值65
5.3switch语句66
问与答69
练习题72
编程题74
第6章 循环77
6.1while语句77
6.2do语句80
6.3for语句82
6.3.1for语句的惯用法83
6.3.2在for语句中省略表达式83
6.3.3C99中的for语句84
6.3.4逗号运算符84
6.4退出循环86
6.4.1break语句87
6.4.2continue语句87
6.4.3goto语句88
6.5空语句90
问与答92
练习题94
编程题95
第7章 基本类型97
7.1整数类型97
7.1.1C99中的整数类型99
7.1.2整型常量99
7.1.3C99中的整型常量100
7.1.4整数溢出100
7.1.5读/写整数101
7.2浮点类型102
7.2.1浮点常量103
7.2.2读/写浮点数103
7.3字符类型104
7.3.1字符操作104
7.3.2有符号字符和无符号字符105
7.3.3算术类型105
7.3.4转义序列106
7.3.5字符处理函数107
7.3.6用scanf和printf读/写字符108
7.3.7用getchar和putchar读/写字符108
7.4类型转换110
7.4.1常规算术转换111
7.4.2赋值过程中的转换112
7.4.3C99中的隐式转换113
7.4.4强制类型转换114
7.5类型定义115
7.5.1类型定义的优点115
7.5.2类型定义和可移植性116
7.6sizeof运算符117
问与答117
练习题120
编程题121
第8章 数组124
8.1一维数组124
8.1.1数组下标124
8.1.2数组初始化126
8.1.3指示器127
8.1.4对数组使用sizeof运算符129
8.2多维数组130
8.2.1多维数组初始化131
8.2.2常量数组132
8.3C99中的变长数组134
问与答135
练习题136
编程题138
第9章 函数141
9.1函数的定义和调用141
9.1.1函数定义144
9.1.2函数调用145
9.2函数声明147
9.3实际参数149
9.3.1实际参数的转换150
9.3.2数组型实际参数151
9.3.3变长数组形式参数153
9.3.4在数组参数声明中使用static154
9.3.5复合字面量155
9.4return语句155
9.5程序终止156
9.6递归157
9.7泛型选择161
问与答163
练习题166
编程题169
第10章 程序结构171
10.1局部变量171
10.1.1静态局部变量172
10.1.2形式参数172
10.2外部变量172
10.2.1示例:用外部变量实现栈172
10.2.2外部变量的利与弊173
10.3程序块177
10.4作用域178
10.5构建C程序179
问与答185
练习题185
编程题186
第11章 指针188
11.1指针变量188
11.2取地址运算符和间接寻址运算符189
11.2.1取地址运算符189
11.2.2间接寻址运算符190
11.3指针赋值191
11.4指针作为参数192
11.5指针作为返回值195
问与答196
练习题198
编程题199
第12章 指针和数组201
12.1指针的算术运算201
12.1.1指针加上整数202
12.1.2指针减去整数202
12.1.3两个指针相减203
12.1.4指针比较203
12.1.5指向复合字面量的指针203
12.2指针用于数组处理204
12.3用数组名作为指针206
12.3.1数组型实际参数(改进版)207
12.3.2用指针作为数组名208
12.4指针和多维数组209
12.4.1处理多维数组的元素209
12.4.2处理多维数组的行210
12.4.3处理多维数组的列210
12.4.4用多维数组名作为指针210
12.5C99中的指针和变长数组211
问与答212
练习题213
编程题215
第13章 字符串217
13.1字面串217
13.1.1字面串中的转义序列217
13.1.2延续字面串218
13.1.3如何存储字面串218
13.1.4字面串的操作219
13.1.5字面串与字符常量219
13.2字符串变量220
13.2.1初始化字符串变量220
13.2.2字符数组与字符指针221
13.3字符串的读和写222
13.3.1用printf函数和puts函数写字符串222
13.3.2用scanf函数读字符串223
13.3.3逐个字符读字符串224
13.4访问字符串中的字符225
13.5使用C语言的字符串库226
13.5.1strcpy函数226
13.5.2strlen函数227
13.5.3strcat函数228
13.5.4strcmp函数229
13.6字符串惯用法231
13.6.1搜索字符串的结尾232
13.6.2复制字符串233
13.7字符串数组235
问与答238
练习题241
编程题243
第14章 预处理器246
14.1预处理器的工作原理246
14.2预处理指令248
14.3宏定义248
14.3.1简单的宏249
14.3.2带参数的宏250
14.3.3#运算符252
14.3.4##运算符253
14.3.5宏的通用属性254
14.3.6宏定义中的圆括号254
14.3.7创建较长的宏255
14.3.8预定义宏256
14.3.9C99中新增的预定义宏257
14.3.10空的宏参数258
14.3.11参数个数可变的宏259
14.3.12__func__标识符260
14.4条件编译260
14.4.1#if指令和#endif指令260
14.4.2defined运算符261
14.4.3#ifdef指令和#ifndef指令261
14.4.4#elif指令和#else指令262
14.4.5使用条件编译262
14.5其他指令263
14.5.1#error指令263
14.5.2#line指令264
14.5.3#pragma指令265
14.5.4_Pragma运算符265
问与答266
练习题268
第15章 编写大型程序272
15.1源文件272
15.2头文件273
15.2.1#include指令273
15.2.2共享宏定义和类型定义274
15.2.3共享函数原型275
15.2.4共享变量声明277
15.2.5嵌套包含278
15.2.6保护头文件278
15.2.7头文件中的#error指令279
15.3把程序划分成多个文件279
15.4构建多文件程序285
15.4.1makefile285
15.4.2链接期间的错误287
15.4.3重新构建程序287
15.4.4在程序外定义宏289
问与答289
练习题291
编程题292
第16章 结构、联合和枚举293
16.1结构变量293
16.1.1结构变量的声明293
16.1.2结构变量的初始化295
16.1.3指示器295
16.1.4对结构的操作296
16.2结构类型296
16.2.1结构标记的声明297
16.2.2结构类型的定义298
16.2.3结构作为参数和返回值298
16.2.4复合字面量299
16.2.5匿名结构300
16.3嵌套的数组和结构301
16.3.1嵌套的结构301
16.3.2结构数组302
16.3.3结构数组的初始化302
16.4联合309
16.4.1用联合来节省空间310
16.4.2用联合来构造混合的数据结构312
16.4.3为联合添加“标记字段”312
16.4.4匿名联合313
16.5枚举314
16.5.1枚举标记和类型名315
16.5.2枚举作为整数315
16.5.3用枚举声明“标记字段”316
问与答316
练习题318
编程题323
第17章 指针的高级应用324
17.1动态存储分配324
17.1.1内存分配函数325
17.1.2空指针325
17.2动态分配字符串326
17.2.1使用malloc函数为字符串分配内存326
17.2.2在字符串函数中使用动态存储分配327
17.2.3动态分配字符串的数组327
17.3动态分配数组329
17.3.1使用malloc函数为数组分配存储空间329
17.3.2calloc函数330
17.3.3realloc函数330
17.4释放存储空间331
17.4.1free函数332
17.4.2“悬空指针”问题332
17.5链表332
17.5.1声明结点类型333
17.5.2创建结点333
17.5.3->运算符334
17.5.4在链表的开始处插入结点335
17.5.5搜索链表337
17.5.6从链表中删除结点338
17.5.7有序链表339
17.6指向指针的指针344
17.7指向函数的指针345
17.7.1函数指针作为参数345
17.7.2qsort函数346
17.7.3函数指针的其他用途347
17.8受限指针350
17.9弹性数组成员351
问与答352
练习题355
编程题358
第18章 声明359
18.1声明的语法359
18.2存储类型360
18.2.1变量的性质361
18.2.2auto存储类型361
18.2.3static存储类型362
18.2.4extern存储类型363
18.2.5register存储类型363
18.2.6函数的存储类型364
18.2.7小结365
18.3类型限定符366
18.4声明符366
18.4.1解释复杂声明368
18.4.2使用类型定义来简化声明369
18.5初始化器369
18.6内联函数371
18.6.1内联定义371
18.6.2对内联函数的限制372
18.6.3在GCC中使用内联函数372
18.7函数指定符_Noreturn和头<stdnoreturn.h>373
18.8静态断言373
问与答374
练习题377
第19章 程序设计379
19.1模块379
19.1.1内聚性与耦合性381
19.1.2模块的类型381
19.2信息隐藏381
19.3抽象数据类型385
19.3.1封装385
19.3.2不完整类型386
19.4栈抽象数据类型386
19.4.1为栈抽象数据类型定义接口386
19.4.2用定长数组实现栈抽象数据类型388
19.4.3改变栈抽象数据类型中数据项的类型389
19.4.4用动态数组实现栈抽象数据类型390
19.4.5用链表实现栈抽象数据类型392
19.5抽象数据类型的设计问题394
19.5.1命名惯例394
19.5.2错误处理394
19.5.3通用抽象数据类型394
19.5.4新语言中的抽象数据类型395
问与答395
练习题396
编程题397
第20章 底层程序设计398
20.1位运算符398
20.1.1移位运算符398
20.1.2按位取反运算符、按位与运算符、按位异或运算符和按位或运算符399
20.1.3用位运算符访问位400
20.1.4用位运算符访问位域401
20.2结构中的位域403
20.3其他底层技术405
20.3.1定义依赖机器的类型405
20.3.2用联合来提供数据的多个视角405
20.3.3将指针作为地址使用407
20.3.4volatile类型限定符409
20.4对象的对齐410
20.4.1对齐运算符_Alignof410
20.4.2对齐指定符_Alignas和头<stdalign.h>410
问与答411
练习题411
编程题413
第21章 标准库414
21.1标准库的使用414
21.1.1对标准库中所用名字的限制415
21.1.2使用宏隐藏的函数415
21.2C89标准库概述416
21.3C99标准库更新417
21.4<stddef.h>:常用定义418
21.5<stdbool.h>:布尔类型和值419
21.6C11标准库更新419
21.7<stdalign.h>:地址的对齐420
21.8<stdnoreturn.h>:宏noreturn的定义420
问与答420
练习题421
编程题422
第22章 输入/输出423
22.1流423
22.1.1文件指针424
22.1.2标准流和重定向424
22.1.3文本文件与二进制文件425
22.2文件操作426
22.2.1打开文件426
22.2.2模式427
22.2.3关闭文件428
22.2.4为打开的流附加文件428
22.2.5从命令行获取文件名429
22.2.6临时文件430
22.2.7文件缓冲431
22.2.8其他文件操作432
22.3格式化的输入/输出433
22.3.1…printf函数433
22.3.2…printf转换说明433
22.3.3C99对…printf转换说明的修改435
22.3.4…printf转换说明示例436
22.3.5…scanf函数438
22.3.6…scanf格式串438
22.3.7…scanf转换说明439
22.3.8C99对…scanf转换说明的改变441
22.3.9scanf示例441
22.3.10检测文件末尾和错误条件442
22.4字符的输入/输出444
22.4.1输出函数444
22.4.2输入函数444
22.5行的输入/输出446
22.5.1输出函数446
22.5.2输入函数447
22.6块的输入/输出447
22.7文件定位448
22.8字符串的输入/输出451
22.8.1输出函数451
22.8.2输入函数452
问与答452
练习题455
编程题458
第23章 库对数值和字符数据的支持462
23.1<float.h>:浮点类型的特性462
23.2<limits.h>:整数类型的大小464
23.3<math.h>:数学计算(C89)465
23.3.1错误465
23.3.2三角函数466
23.3.3双曲函数466
23.3.4指数函数和对数函数467
23.3.5幂函数467
23.3.6就近舍入函数、绝对值函数和取余函数468
23.4<math.h>:数学计算468
23.4.1IEEE浮点标准469
23.4.2类型470
23.4.3宏470
23.4.4错误470
23.4.5函数471
23.4.6分类宏471
23.4.7三角函数472
23.4.8双曲函数472
23.4.9指数函数和对数函数473
23.4.10幂函数和绝对值函数474
23.4.11误差函数和伽马函数474
23.4.12就近舍入函数475
23.4.13取余函数476
23.4.14操作函数477
23.4.15最大值函数、最小值函数和正差函数477
23.4.16浮点乘加478
23.4.17比较宏478
23.5<ctype.h>:字符处理479
23.5.1字符分类函数479
23.5.2字符大小写映射函数481
23.6<string.h>:字符串处理482
23.6.1复制函数482
23.6.2拼接函数483
23.6.3比较函数484
23.6.4搜索函数485
23.6.5其他函数487
问与答488
练习题488
编程题490
第24章 错误处理491
24.1<assert.h>:诊断491
24.2<errno.h>:错误492
24.3<signal.h>:信号处理494
24.3.1信号宏494
24.3.2signal函数494
24.3.3预定义的信号处理函数495
24.3.4raise函数496
24.4<setjmp.h>:非局部跳转497
问与答499
练习题500
第25章 国际化特性502
25.1<locale.h>:本地化502
25.1.1类项503
25.1.2setlocale函数503
25.1.3localeconv函数504
25.2多字节字符和宽字符507
25.2.1多字节字符507
25.2.2宽字符508
25.2.3Unicode和通用字符集508
25.2.4Unicode编码509
25.2.5多字节/宽字符转换函数510
25.2.6多字节/宽字符串转换函数511
25.3双联符和三联符512
25.3.1三联符512
25.3.2双联符513
25.3.3<iso646.h>:拼写替换513
25.4通用字符名514
25.5<wchar.h>:扩展的多字节和宽字符实用工具514
25.5.1流的倾向性515
25.5.2格式化宽字符输入/输出函数515
25.5.3宽字符输入/输出函数517
25.5.4通用的宽字符串实用工具518
25.5.5宽字符时间转换函数521
25.5.6扩展的多字节/宽字符转换实用工具521
25.6<wctype.h>:宽字符分类和映射实用工具523
25.6.1宽字符分类函数524
25.6.2可扩展的宽字符分类函数525
25.6.3宽字符大小写映射函数525
25.6.4可扩展的宽字符大小写映射函数525
25.7<uchar.h>:改进的Unicode支持526
25.7.1带u、U和u8前缀的字面串526
25.7.2可重启动的多字节/宽字符转换函数527
问与答528
练习题529
编程题530
第26章 其他库函数531
26.1<stdarg.h>:可变参数531
26.1.1调用带有可变参数列表的函数533
26.1.2v…printf函数533
26.1.3v…scanf函数534
26.2<stdlib.h>:通用的实用工具534
26.2.1数值转换函数535
26.2.2伪随机序列生成函数537
26.2.3与环境的通信539
26.2.4搜索和排序实用工具540
26.2.5整数算术运算函数542
26.2.6地址对齐的内存分配542
26.3<time.h>:日期和时间542
26.3.1时间处理函数543
26.3.2时间转换函数545
问与答550
练习题552
编程题553
第27章 C99对数学计算的新增支持554
27.1<stdint.h>:整数类型554
27.1.1<stdint.h>类型555
27.1.2对指定宽度整数类型的限制555
27.1.3对其他整数类型的限制556
27.1.4用于整型常量的宏557
27.2<inttypes.h>:整数类型的格式转换557
27.2.1用于格式指定符的宏557
27.2.2用于最大宽度整数类型的函数558
27.3复数559
27.3.1复数的定义559
27.3.2复数的算术运算560
27.3.3C99中的复数类型561
27.3.4复数的运算561
27.3.5复数类型的转换规则562
27.4<complex.h>:复数算术运算562
27.4.1<complex.h>宏562
27.4.2CX_LIMITED_RANGE编译提示563
27.4.3<complex.h>函数564
27.4.4三角函数564
27.4.5双曲函数565
27.4.6指数函数和对数函数565
27.4.7幂函数和绝对值函数566
27.4.8操作函数566
27.5<tgmath.h>:泛型数学567
27.5.1泛型宏568
27.5.2调用泛型宏569
27.6<fenv.h>:浮点环境570
27.6.1浮点状态标志和控制模式570
27.6.2<fenv.h>宏571
27.6.3FENV_ACCESS编译提示571
27.6.4浮点异常函数572
27.6.5舍入函数573
27.6.6环境函数573
问与答573
练习题574
编程题575
第28章 C1X新增的多线程和原子操作支持576
28.1<threads.h>:多线程执行支持577
28.1.1线程启动函数577
28.1.2线程的创建和管理函数578
28.1.3数据竞争581
28.1.4互斥函数583
28.1.5条件变量585
28.1.6条件变量函数587
28.1.7递归锁和非递归锁591
28.1.8初始化函数591
28.1.9_Thread_local存储类和线程存储期593
28.1.10线程专属存储595
28.1.11线程专属存储函数596
28.2_Atomic、<stdatomic.h>:原子类型和原子操作支持599
28.2.1_Atomic:类型指定符/类型限定符600
28.2.2标准库定义的原子类型600
28.2.3初始化原子变量601
28.2.4原子变量的初始化函数601
28.2.5原子操作602
28.2.6原子操作函数604
28.2.7内存顺序608
28.2.8围栏函数613
28.2.9锁无关判断函数615
28.2.10原子标志类型及其操作函数616
问与答619
练习题619
编程题620
附录AC语言运算符621
附录BC1X与C99的比较622
附录CC99与C89的比较624
附录DC89与经典C的比较628
附录E标准库函数631
附录FASCII字符集673
延伸阅读674
索引(图灵社区下载)

蜀ICP备2024047804号

Copyright 版权所有 © jvwen.com 聚文网