Chapter1: 风格 1
1.1 名字 3
1.2 表达式和语 6
1.3 一致性和习惯用法 10
1.4 函数宏 17
1.5 幻数 19
1.6 注释 23
1.7 为何要在风格方面费心 27
Chapter 2: 算法与数据结构 29
2.1 检索 30
2.2 排序 32
2.3 库 34
2.4 一个Java快速排序实现 37
2.5 大O记法 40
2.6 自增长数组 41
2.7 表 44
2.8 树 50
2.9 散列表 55
2.10 小结 58
Chapter3: 设计与实现 61
3.1 马尔可夫链算法 62
3.2 在多种数据结构之间选择 64
3.3 使用C语言构建数据结构 65
3.4 生成输出 69
3.5 Java 71
3.6 C++ 76
3.7 Awk和 Perl 78
3.8 性能 80
3.9 经验教训 82
Chapter4: 接口 85
4.1 逗号分隔值 86
4.2 一个原型库 87
4.3 一个给他人用的库 91
4.4 一个C++实现 99
4.5 接口原则 103
4.6 资源管理 106
4.7 中止、重试或失败 109
4.8 用户界面 113
Chapter 5: 调试 117
5.1 调试器 118
5.2 线索明显、易于发现的错误 119
5.3 线索不明、难以发现的错误 123
5.4 最后的手段 127
5.5 不可重现的错误 130
5.6 调试工具 131
5.7 他人引入的错误 135
5.8 小结 136
Chapter6: 测试 139
6.1 一边编码,一边测试 140
6.2 系统化测试 145
6.3 测试自动化 149
6.4 测试脚手架 151
6.5 压力测试 155
6.6 测试心得 158
6.7 谁来测试 159
6.8 马尔可夫程序的测试 160
6.9 小结 162
Chapter7: 性能 165
7.1 瓶颈 166
7.2 计时和剖析 171
7.3 加速策略 175
7.4 代码调优 178
7.5 空间利用率 182
7.6 评估 184
7.7 小结 187
Chapter 8: 可移植性 189
8.1 语言 190
8.2 头文件和库 196
8.3 程序架构 198
8.4 隔离 202
8.5 数据交换 203
8.6 字节序 204
8.7 可移植性和升级 207
8.8 国际化 209
8.9 小结 212
Chapter9: 记法 215
9.1 数据格式化 216
9.2 正则表达式 222
9.3 可编程工具 228
9.4 解释器、编译器和虚拟机 231
9.5 写程序的程序 237
9.6 用宏生成代码 240
9.7 运行中编译 241
后记 247
Appendix: 规则汇编 249