第1章 预备知识 1
1.1 源文件 1
1.2 程序转换(过程) 1
1.3 环境 2
1.3.1 转换环境 3
1.3.2 执行环境 3
1.4 C实现 4
1.5 诊断消息 4
1.6 转换单元 5
1.7 输入和输出 6
1.8 库和头文件 13
1.9 C标准库 16
第2章 基本概念 20
2.1 字符集和字符编码 20
2.1.1 源字符集 31
2.1.2 执行字符集 31
2.2 字符 33
2.2.1 多字节字符 33
2.2.2 宽字符 33
2.2.3 空字符 34
2.2.4 空白(字符) 34
2.2.5 空宽字符 34
2.3 统一字符名 35
2.4 脱转序列(转义序列) 36
2.5 三联序列 38
2.6 (字符)串 39
2.6.1 多字节(字符)串 42
2.6.2 宽(字符)串 43
2.7 对象 44
2.7.1 值 46
2.7.2 访问 46
2.7.3 存储期 46
2.7.3.1 静态存储期 47
2.7.3.2 线程存储期 48
2.7.3.3 自动存储期 50
2.7.3.4 指派存储期 51
2.7.4 生存期 51
2.7.5 对齐 60
2.7.5.1 基础对齐 62
2.7.5.2 扩展对齐 62
2.8 字节 63
2.9 行为 63
2.9.1 未定义行为 64
2.9.2 未指定行为 64
2.9.3 实现定义行为 65
2.9.4 区域指定行为 65
第3章 类型 66
3.1 类型图 66
3.2 基本类型 67
3.2.1 无符号整数类型 67
3.2.1.1 标准无符号整数类型 68
3.2.1.1.1 _Bool 68
3.2.1.1.2 unsigned char 69
3.2.1.1.3 unsigned short int 70
3.2.1.1.4 unsigned int 70
3.2.1.1.5 unsigned long int 70
3.2.1.1.6 unsigned long long int 70
3.2.1.2 扩展无符号整数类型 70
3.2.2 有符号整数类型 71
3.2.2.1 标准有符号整数类型 71
3.2.2.1.1 signed char 71
3.2.2.1.2 short int 71
3.2.2.1.3 int 71
3.2.2.1.4 long int 72
3.2.2.1.5 long long int 72
3.2.2.2 扩展有符号整数类型 72
3.2.3 浮点类型 72
3.2.3.1 复数类型 73
3.2.3.2 实浮点类型 73
3.2.3.2.1 float 73
3.2.3.2.2 double 73
3.2.3.2.3 long double 74
3.2.4 char 74
3.3 标准整数类型 75
3.4 扩展整数类型 75
3.5 算术类型 75
3.5.1 整数类型 75
3.5.1.1 枚举类型 76
3.6 实数类型 81
3.7 字符类型 81
3.8 派生类型 81
3.8.1 数组(类型) 82
3.8.1.1 变长数组 86
3.8.1.2 可变修改类型 89
3.8.2 结构 89
3.8.2.1 位字段 95
3.8.2.2 弹性数组成员 96
3.8.2.3 匿名结构 100
3.8.3 联合 101
3.8.3.1 匿名联合 105
3.8.3.2 标记 106
3.8.4 指针类型 106
3.8.4.1 空指针常量 112
3.8.4.2 空指针 113
3.8.5 函数 114
3.8.6 原子类型 116
3.9 标量 118
3.10 聚合类型 118
3.11 对象类型 118
3.12 void 119
3.13 限定的类型 119
3.13.1 const限定的类型 121
3.13.2 volatile限定的类型 123
3.13.3 restrict限定的类型 124
3.14 完整类型 126
3.15 不完整类型 126
3.16 类型域 128
3.17 类型的表示 129
3.17.1 纯二进制计数法 130
3.17.2 对象表示 130
3.17.2.1 负零 133
3.17.2.2 精度 134
3.17.2.3 宽度 134
3.17.3 自陷表示 134
3.17.3.1 未指定的值 135
3.17.3.2 不确定的值 135
3.17.4 符号比特 135
3.17.5 值比特 136
3.17.6 填充比特 136
3.18 兼容类型 136
3.19 复合类型 143
3.20 类型转换 146
3.20.1 标量-Bool转换 147
3.20.2 整数-整数转换 147
3.20.3 实浮点-整数转换 148
3.20.4 实浮点-实浮点转换 148
3.20.5 复数-复数转换 148
3.20.6 实数-复数转换 148
3.20.7 左值转换 149
3.20.8 数组-指针转换 149
3.20.9 函数指示符-指针转换 153
3.20.10 指针-void指针转换 153
3.20.11 整数-指针转换 154
3.20.12 指针-指针转换 156
3.20.13 整型提升 161
3.20.13.1 (整型)转换阶 162
3.20.14 常规算术转换 163
3.20.15 默认参数提升 166
3.21 有效类型 166
第4章 词法元素 168
4.1 预处理记号 168
4.2 记号 168
4.3 标识符 169
4.3.1 预定义标识符 170
4.3.2 名字空间 171
4.3.3 作用域 172
4.3.3.1 文件作用域 176
4.3.3.2 块作用域 176
4.3.3.3 函数作用域 177
4.3.3.4 函数原型作用域 177
4.3.4 链接 177
4.3.4.1 外部链接 182
4.3.4.2 内部链接 186
4.3.4.3 无链接 188
4.4 常量 189
4.4.1 整型常量 190
4.4.2 浮点常量 192
4.4.3 枚举常量 194
4.4.4 字符常量 194
4.5 字面串 196
4.6 注释 201
4.7 关键字 204
第5章 声明和定义 205
5.1 声明 205
5.1.1 (函数)原型 211
5.1.2 外部声明 211
5.2 定义 212
5.2.1 内联定义 213
5.2.2 外部定义 214
5.2.2.1 外部对象定义 215
5.2.2.2 试探性定义 216
5.2.2.3 函数定义 217
5.2.2.3.1 main函数 220
5.3 静态断言 222
5.4 声明指定符 222
5.4.1 类型指定符 223
5.4.2 结构或联合指定符 224
5.4.3 枚举指定符 231
5.4.4 原子类型指定符 234
5.4.5 typedef名 234
5.5 存储类指定符 235
5.5.1 typedef 236
5.5.1.1 类型定义 239
5.5.2 extern 243
5.5.3 static 244
5.5.4 Thread local 245
5.5.5 register 248
5.5.6 auto 249
5.6 类型限定符 249
5.6.1 const 250
5.6.2 volatile 250
5.6.3 restrict 250
5.6.4 _Atomic 251
5.7 函数指定符 251
5.7.1 inline 252
5.7.2 _Noreturn 256
5.8 对齐指定符 257
5.9 声明符 260
5.9.1 指针声明符 260
5.9.2 数组声明符 263
5.9.3 函数声明符 264
5.9.4 全声明符 267
5.10 初始化 267
5.10.1 初始化器 277
5.11 类型名 280
第6章 表达式 282
6.1 表达式列表 282
6.2 全表达式 283
6.3 函数指示符 284
6.4 左值 284
6.4.1 可修改的左值 285
6.5 值计算 287
6.6 VOID表达式 288
6.7 副作用 289
6.8 序列点 289
6.8.1 前序 290
6.8.2 后序 290
6.8.3 无序 291
6.8.4 不确定顺序 291
6.9 优先级 291
6.10 结合性 292
6.10.1 左结合 292
6.10.2 右结合 292
6.11 求值 293
6.12 基本表达式 296
6.12.1 泛型选择 297
6.13 后缀表达式 300
6.13.1 复合字面值 300
6.13.2 数组下标 303
6.13.3 函数调用 305
6.13.3.1 形参 310
6.13.3.2 实参 311
6.13.4 成员选择 312
6.13.5 后缀递增 313
6.13.6 后缀递减 314
6.14 一元表达式 315
6.14.1 前缀递增 316
6.14.2 前缀递减 317
6.14.3 地址 318
6.14.4 间接 319
6.14.5 正号 321
6.14.6 负号 322
6.14.7 按位反 324
6.14.8 逻辑非 325
6.14.9 尺寸 327
6.14.10 对齐 331
6.15 转型表达式 332
6.16 乘性表达式 335
6.16.1 乘法 336
6.16.2 除法 336
6.16.3 取余 336
6.17 加性表达式 337
6.17.1 加法 337
6.17.2 减法 339
6.18 移位表达式 341
6.18.1 左移 341
6.18.2 右移 343
6.19 关系表达式 344
6.20 等性表达式 348
6.21 按位与表达式 351
6.22 按位异或表达式 352
6.23 按位或表达式 353
6.24 逻辑与表达式 353
6.25 逻辑或表达式 354
6.26 条件表达式 355
6.27 赋值表达式 359
6.27.1 简单赋值 360
6.27.2 复合赋值 364
6.28 逗号表达式 365
6.29 常量表达式 368
6.29.1 整型常量表达式 369
6.29.2 算术常量表达式 370
6.29.3 地址常量 371
第7章 语句和块 372
7.1 语句 372
7.2 标号语句 372
7.3 复合语句 374
7.4 表达式语句 374
7.5 选择语句 376
7.5.1 if语句 376
7.5.2 switch语句 378
7.6 迭代语句 382
7.6.1 for语句 383
7.6.2 while语句 386
7.6.3 do语句 387
7.7 跳转语句 388
7.7.1 goto语句 388
7.7.2 continue语句 390
7.7.3 break语句 390
7.7.4 return语句 391
7.8 块 393
第8章 预处理指令 396
8.1 源文件包含 397
8.2 宏替换 398
8.2.1 对象式宏定义 400
8.2.2 函数式宏定义 400
8.2.2.1 记号串化(#) 404
8.2.2.2 记号黏接(##) 405
8.2.3 预定义宏 406
8.3 条件包含 407
8.4 行控制 409
8.5 抛错 410
8.6 杂注 410
8.7 空指令 411