技术教育社区
www.teccses.org

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

封面

作者:[美]K.N.金(K.N.King)

页数:672

出版社:人民邮电出版社

出版日期:2021

ISBN:9787115565198

电子书格式:pdf/epub/txt

内容简介

时至今日,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语言指南》等。

本书特色

适读人群 :本书是C开发人员的理想参考书,在国外也被众多大学作为C语言课程的教材。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专家

目录

第 1章 C语言概述 1

1.1 C语言的历史 1

1.1.1 起源 1

1.1.2 标准化 1

1.1.3 基于C的语言 2

1.2 C语言的优缺点 3

1.2.1 C语言的优点 3

1.2.2 C语言的缺点 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.8 C 程序的书写规范 21

问与答 23

练习题 25

编程题 26

第3章 格式化输入/输出 28

3.1 printf函数 28

3.1.1 转换说明 29

3.1.2 转义序列 31

3.2 scanf函数 31

3.2.1 scanf函数的工作方法 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.2 if语句 58

5.2.1 复合语句 59

5.2.2 else子句 59

5.2.3 级联式if语句 61

5.2.4 “悬空else”的问题 63

5.2.5 条件表达式 63

5.2.6 C89中的布尔值 64

5.2.7 C99中的布尔值 65

5.3 switch语句 66

问与答 69

练习题 72

编程题 74

第6章 循环 77

6.1 while语句 77

6.2 do语句 80

6.3 for语句 82

6.3.1 for语句的惯用法 83

6.3.2 在for语句中省略表达式 83

6.3.3 C99中的for语句 84

6.3.4 逗号运算符 84

6.4 退出循环 86

6.4.1 break语句 87

6.4.2 continue语句 87

6.4.3 goto语句 88

6.5 空语句 90

问与答 92

练习题 94

编程题 95

第7章 基本类型 97

7.1 整数类型 97

7.1.1 C99中的整数类型 99

7.1.2 整型常量 99

7.1.3 C99中的整型常量 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.3 C99中的隐式转换 113

7.4.4 强制类型转换 114

7.5 类型定义 115

7.5.1 类型定义的优点 115

7.5.2 类型定义和可移植性 116

7.6 sizeof运算符 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.3 C99 中的变长数组 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 在数组参数声明中使用static 154

9.3.5 复合字面量 155

9.4 return语句 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.5 C99中的指针和变长数组 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.1 strcpy函数 226

13.5.2 strlen函数 227

13.5.3 strcat函数 228

13.5.4 strcmp函数 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.9 C99中新增的预定义宏 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.2 defined运算符 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.1 makefile 285

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.2 calloc函数 330

17.3.3 realloc函数 330

17.4 释放存储空间 331

17.4.1 free函数 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.2 qsort函数 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.2 auto存储类型 361

18.2.3 static存储类型 362

18.2.4 extern存储类型 363

18.2.5 register存储类型 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和头 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.4 volatile类型限定符 409

20.4 对象的对齐 410

20.4.1 对齐运算符_Alignof 410

20.4.2 对齐指定符_Alignas和头 410

问与答 411

练习题 411

编程题 413

第 21章 标准库 414

21.1 标准库的使用 414

21.1.1 对标准库中所用名字的限制 415

21.1.2 使用宏隐藏的函数 415

21.2 C89标准库概述 416

21.3 C99标准库更新 417

21.4 :常用定义 418

21.5 :布尔类型和值 419

21.6 C11标准库更新 419

21.7 :地址的对齐 420

21.8 :宏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.3 C99对…printf转换说明的修改 435

22.3.4 …printf转换说明示例 436

22.3.5 …scanf函数 438

22.3.6 …scanf格式串 438

22.3.7 …scanf转换说明 439

22.3.8 C99对…scanf转换说明的改变 441

22.3.9 scanf示例 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 :浮点类型的特性 462

23.2 :整数类型的大小 464

23.3 :数学计算(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 :数学计算 468

23.4.1 IEEE浮点标准 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 :字符处理 479

23.5.1 字符分类函数 479

23.5.2 字符大小写映射函数 481

23.6 :字符串处理 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 :诊断 491

24.2 :错误 492

24.3 :信号处理 494

24.3.1 信号宏 494

24.3.2 signal函数 494

24.3.3 预定义的信号处理函数 495

24.3.4 raise函数 496

24.4 :非局部跳转 497

问与答 499

练习题 500

第 25章 国际化特性 502

25.1 :本地化 502

25.1.1 类项 503

25.1.2 setlocale函数 503

25.1.3 localeconv函数 504

25.2 多字节字符和宽字符 507

25.2.1 多字节字符 507

25.2.2 宽字符 508

25.2.3 Unicode和通用字符集 508

25.2.4 Unicode编码 509

25.2.5 多字节/宽字符转换函数 510

25.2.6 多字节/宽字符串转换函数 511

25.3 双联符和三联符 512

25.3.1 三联符 512

25.3.2 双联符 513

25.3.3 :拼写替换 513

25.4 通用字符名 514

25.5 :扩展的多字节和宽字符实用工具 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 :宽字符分类和映射实用工具 523

25.6.1 宽字符分类函数 524

25.6.2 可扩展的宽字符分类函数 525

25.6.3 宽字符大小写映射函数 525

25.6.4 可扩展的宽字符大小写映射函数 525

25.7 :改进的Unicode支持 526

25.7.1 带u、U和u8前缀的字面串 526

25.7.2 可重启动的多字节/宽字符转换函数 527

问与答 528

练习题 529

编程题 530

第 26章 其他库函数 531

26.1 :可变参数 531

26.1.1 调用带有可变参数列表的函数 533

26.1.2 v…printf函数 533

26.1.3 v…scanf函数 534

26.2 :通用的实用工具 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 :日期和时间 542

26.3.1 时间处理函数 543

26.3.2 时间转换函数 545

问与答 550

练习题 552

编程题 553

第 27章 C99对数学计算的新增支持 554

27.1 :整数类型 554

27.1.1 类型 555

27.1.2 对指定宽度整数类型的限制 555

27.1.3 对其他整数类型的限制 556

27.1.4 用于整型常量的宏 557

27.2 :整数类型的格式转换 557

27.2.1 用于格式指定符的宏 557

27.2.2 用于最大宽度整数类型的函数 558

27.3 复数 559

27.3.1 复数的定义 559

27.3.2 复数的算术运算 560

27.3.3 C99中的复数类型 561

27.3.4 复数的运算 561

27.3.5 复数类型的转换规则 562

27.4 :复数算术运算 562

27.4.1 宏 562

27.4.2 CX_LIMITED_RANGE编译提示 563

27.4.3 函数 564

27.4.4 三角函数 564

27.4.5 双曲函数 565

27.4.6 指数函数和对数函数 565

27.4.7 幂函数和绝对值函数 566

27.4.8 操作函数 566

27.5 :泛型数学 567

27.5.1 泛型宏 568

27.5.2 调用泛型宏 569

27.6 :浮点环境 570

27.6.1 浮点状态标志和控制模式 570

27.6.2 宏 571

27.6.3 FENV_ACCESS编译提示 571

27.6.4 浮点异常函数 572

27.6.5 舍入函数 573

27.6.6 环境函数 573

问与答 573

练习题 574

编程题 575

第 28章 C1X新增的多线程和原子操作支持 576

28.1 :多线程执行支持 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、:原子类型和原子操作支持 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

附录A C语言运算符 621

附录B C1X与C99的比较 622

附录C C99与C89的比较 624

附录D C89与经典C的比较 628

附录E标准库函数 631

附录F ASCII字符集 673

延伸阅读 674

索引(图灵社区下载)

下载地址

立即下载

(解压密码:www.teccses.org)

Article Title:《C语言程序设计 现代方法 第2版·修订版》
Article link:https://www.teccses.org/1271770.html