第0章 导读 1
第1章 词法“陷阱” 5
1.1 =不同于== 6
1.2 &和|不同于&&和‖ 8
1.3 词法分析中的“贪心法” 8
1.4 整型常量 10
1.5 字符与字符串 11
第2章 语法“陷阱” 15
2.1 理解函数声明 15
2.2 运算符的优先级问题 19
2.3 注意作为语句结束标志的分号 24
2.4 switch语句 26
2.5 函数调用 28
2.6 “悬挂”else引发的问题 29
第3章 语义“陷阱” 33
3.1 指针与数组 33
3.2 非数组的指针 39
3.3 作为参数的数组声明 41
3.4 避免“举隅法” 43
3.5 空指针并非空字符串 44
3.6 边界计算与不对称边界 45
3.7 求值顺序 57
3.8 运算符&&、‖和! 59
3.9 整数溢出 61
3.10 为函数main提供返回值 62
第4章 连接 65
4.1 什么是连接器 65
4.2 声明与定义 67
4.3 命名冲突与static修饰符 69
4.4 形参、实参与返回值 70
4.5 检查外部类型 77
4.6 头文件 80
第5章 库函数 83
5.1 返回整数的getchar函数 84
5.2 更新顺序文件 85
5.3 缓冲输出与内存分配 86
5.4 使用errno检测错误 88
5.5 库函数signal 89
第6章 预处理器 93
6.1 不能忽视宏定义中的空格 94
6.2 宏并不是函数 94
6.3 宏并不是语句 99
6.4 宏并不是类型定义 101
第7章 可移植性缺陷 103
7.1 应对C语言标准变更 104
7.2 标识符名称的限制 106
7.3 整数的大小 107
7.4 字符是有符号整数还是无符号整数 108
7.5 移位运算符 109
7.6 内存位置0 110
7.7 除法运算时发生的截断 111
7.8 随机数的大小 113
7.9 大小写转换 113
7.10 首先释放,然后重新分配 115
7.11 可移植性问题的一个例子 116
第8章 建议与答案 121
8.1 建议 122
8.2 答案 126
附录A PRINTF,VARARGS与STDARG 145
附录B Koenig和Moo夫妇访谈 167