第1章 从1加到100 1
1.1 如何从1加到100 2
1.1.1 标准整数类型 7
1.2 相加过程的实现 9
1.2.1 左值和左值转换 13
1.2.2 表达式的值 14
1.2.3 运算符的优先级 16
1.2.4 运算符的结合性 17
1.3 源文件 20
1.3.1 函数 20
1.3.2 return语句 22
1.3.3 main函数 22
第2章 程序的翻译、执行和调试 24
2.1 C实现 25
2.2 程序的翻译和执行 27
2.3 程序的调试 28
2.4 集成开发环境 33
2.5 执行环境 35
2.6 从1加到N 38
2.6.1 注释 39
2.6.2 函数调用和函数调用运算符 39
2.6.3 函数原型 40
第3章 更多的相加方法 44
3.1 变量的初始化 45
3.2 认识复合赋值 46
3.3 认识递增运算符 47
3.4 初识复杂的表达式 48
3.5 认识关系运算符 49
3.6 求值 50
3.7 认识逗号表达式 53
3.7.1 全表达式和序列点 54
3.8 认识表达式语句 56
3.9 认识递减和逻辑求反运算符 57
3.10 参数值的有效性检查 59
3.10.1 认识if语句 60
3.10.2 认识逻辑或运算符 62
3.10.3 未定义的行为 63
3.10.4 摇摆的else子句 65
3.10.5 认识逻辑与运算符 66
3.11 认识标号语句和goto语句 68
第4章 指针不是指南针 71
4.1 认识一元&和一元*运算符 72
4.2 什么是指针 75
4.3 指针类型的变量 76
4.4 指向函数的指针 79
4.4.1 函数指示符—指针转换 80
4.5 返回指针的函数 83
4.6 掌握C语言需要建立类型的观念 85
4.6.1 整型常量 86
4.6.2 整数—整数转换 88
4.6.3 表达式的类型 89
4.6.4 认识整型转换阶和整型提升 92
4.6.5 指针—整数转换 96
4.6.6 指针—指针转换 98
4.7 指向指针(类型)的指针 102
第5章 准备显示累加结果 104
5.1 什么是数组 105
5.1.1 数组变量的声明 106
5.1.2 数组变量的初始化 107
5.1.3 认识sizeof和乘性运算符 108
5.1.4 认识变长数组 112
5.2 文字和编码 114
5.2.1 字符数组 116
5.2.2 字符常量 118
5.2.3 脱转序列 118
5.2.4 字面串和字符串 120
5.3 访问数组元素 122
5.3.1 数组—指针转换 123
5.3.2 指针运算和for语句 125
5.3.3 下标运算符 128
5.3.4 指针的递增和递减 129
5.4 指向数组的指针 135
5.5 元素类型为指针的数组 140
5.8 将数字转换为字符串 144
5.9 元素类型为数组的数组 150
第6章 输入和输出 155
6.1 输入输出那点事 156
6.2 系统调用 158
6.3 编译和链接 163
6.4 库 166
6.5 头文件、预处理和翻译单元 168
6.6 UNIX和类UNIX函数库 173
6.6.1 限定的类型 174
6.6.2 变参函数 177
6.6.3 认识逐位或、逐位与和逐位异或运算符 185
6.6.4 指向void的指针 187
6.6.5 结构类型 191
6.7 Windows动态链接库 200
6.7.1 认识成员选择运算符“.” 204
6.7.2 复合字面值 206
6.7.3 控制台I/O和音频播放 209
6.7.4 函数main的定义 214
6.8 C标准库 217
6.8.1 流 217
6.8.2 restrict限定的类型 219
6.8.3 C标准库的实现 221
6.8.4 标准输入和标准输出 223
6.8.5 标准I/O的缓冲区 226
6.8.6 直接的输入输出 231
6.8.7 格式化输出 233
6.8.8 格式化输入 245
6.8.9 格式化输入输出的实例 252
第7章 字符集和字符编码 266
7.1 字符集和字符编码的演变 267
7.1.1 GB2312字符集 267
7.1.2 GBK和GB18030字符集 268
7.1.3 UNICODE字符集和编码方案 269
7.2 多字节字符和宽字符 273
7.2.1 源字符集和执行字符集 273
7.2.2 多字节字符、宽字符和字节序 278
7.3 C语言的国际化 287
7.3.1 条件包含 292
第8章 欢迎来到类型之家 300
8.1 扩展整数类型 301
8.2 布尔类型_Bool 302
8.3 枚举类型 303
8.4 认识switch语句 305
8.5 联合类型 309
8.6 复数类型 313
8.7 限定的类型 314
8.8 类型的兼容性 315
8.9 类型转换 318
8.9.1 实浮点—整数转换 319
8.9.2 实浮点—实浮点转换 319
8.9.3 复数—复数转换 319
8.9.4 实数—复数转换 320
8.9.5 常规算术转换 320
第9章 作用域、链接、线程和存储期 324
9.1 标识符的作用域 325
9.1.1 函数作用域 325
9.1.2 文件作用域 326
9.1.3 块作用域 327
9.1.4 函数原型作用域 328
9.1.5 作用域的重叠 329
9.1.6 名字空间 331
9.2 标识符的链接 333
9.3 进程和线程 337
9.3.1 创建POSIX线程 340
9.3.2 线程同步 349
9.3.3 执行时间的测量 356
9.4 变量的存储期 357
9.4.1 线程存储期 360
9.4.2 静态存储期 363
9.4.3 自动存储期 367
9.4.4 指派存储期 368
第10章 Windows编程基础 369
10.1 如何编写Windows程序 370
10.1.1 注册窗口类 374
10.1.2 创建窗口 376
10.1.3 进入消息循环 378
10.2 窗口过程 379
10.2.1 函数调用约定 380
10.2.2 消息处理 382
10.2.3 回调函数 382
10.3 数据链表 387
10.3.1 作用域的起始点 387
10.3.2 动态内存分配 388
10.4 创建和应用所选的字体 390
10.5 关闭窗口并退出程序 393
第11章 递归调用、计算器和树 397
11.1 递归的原理 398
11.2 复杂计算器 402
11.2.1 程序的翻译过程 403
11.2.2 算式的语法 409
11.2.3 词法分析 413
11.2.4 函数指定符_Noreturn 417
11.2.5 语法分析 419
11.3 树和二叉树 425
11.4 计算器的二叉树版本 430
11.4.1 非本地跳转(setjmp/longjmp) 437
第12章 运算符和表达式 441
12.1 全表达式 442
12.2 左值转换 442
12.3 基本表达式 442
12.3.1 泛型选择 443
12.4 后缀表达式 445
12.4.1 复合字面值 446
12.4.2 数组下标 447
12.4.3 函数调用 448
12.4.4 成员选择 453
12.4.5 后缀递增 454
12.4.6 后缀递减 455
12.5 一元表达式 455
12.5.1 前缀递增 456
12.5.2 前缀递减 456
12.5.3 地址 457
12.5.4 间接 458
12.5.5 正号 458
12.5.6 负号 458
12.5.7 逐位取反 459
12.5.8 逻辑非 460
12.5.9 尺寸 460
12.5.10 对齐 463
12.6 转型表达式 464
12.7 乘性表达式 465
12.7.1 乘法 466
12.7.2 除法 466
12.7.3 取余 466
12.8 加性表达式 467
12.8.1 加法 467
12.8.2 减法 469
12.9 移位表达式 470
12.9.1 左移 471
12.9.2 右移 472
12.10 关系表达式 472
12.11 等性表达式 475
12.12 逐位与表达式 478
12.13 逐位异或表达式 478
12.14 逐位或表达式 479
12.15 逻辑与表达式 479
12.16 逻辑或表达式 480
12.17 条件表达式 480
12.18 赋值表达式 483
12.18.1 简单赋值 483
12.18.2 复合赋值 484
12.19 逗号表达式 485