引言 1
目录 1
第一章 易犯的词法错误 4
§1.1 =不是== 4
§1.2 &和|不是&&或|| 5
§1.3 贪婪的词法分析 6
§1.4 整型常数 7
§1.5 串与字符 7
第二章 易犯的语法错误 9
§2.1 理解函数说明 9
§2.2 运算符并不总是具有您想要的优先级 12
§2.3 注意那些分号! 14
§2.4 switch语句 16
§2.5 调用函数 17
§2.6 悬挂着的else问题 18
§3.1 指针与数组 20
第三章 易犯的语义错误 20
§3.2 指针不是数组 24
§3.3 数组说明作为参数 25
§3.4 避免提喻法 26
§3.5 空指针不是空字符串 27
§3.6 计数和不对称的边界 27
§3.7 求值的顺序 35
§3.8 &&、||!运算符 37
§3.9 整数溢出 38
§3.10 从main函数返回一个值 38
第四章 连接 41
§4.1 什么是连接器? 41
§4.2 说明与定义 42
§4.3 名字冲突与static修饰语 43
§4.4 自变量、参数与返回值 44
§4.5 检查外部类型 49
§4.6 头文件 51
第五章 库函数 53
§5.1 getchar返回一个整数 53
§5.2 更新一个顺序文件 54
§5.3 缓冲输出与内存分配 55
§5.4 errno用于错误检测 56
§5.5 signal数 57
第六章 预处理器 59
§6.1 在宏定义中的空格问题 59
§6.2 宏不是函数 60
§6.3 宏不是语句 62
§6.4 宏不是类型定义 64
第七章 易犯的可移植性错误 65
§7.1 处理变化 65
§7.2 在一个名字里是什么? 67
§7.4 字符是有符号的还是无符号的? 68
§7.3 一个整数有多大? 68
§7.5 移位运算符 69
§7.6 第零号内存单元 70
§7.7 除法是怎样截断的? 70
§7.8 一个随机数有多大? 71
§7.9 大小写转换 72
§7.10 先释放,然后再重新分配? 73
§7.11 可移植性问题的一个例子 74
第八章 劝告与答案 77
§8.1 劝告 77
§8.2 答案 80
附录A PRINTF、VARARGS与STDARG 94
A.1 printf家族 94
A.2 使用varargs.h的可变的自变量表 104
A.3 stdarg.h:ANSI的varargs.h 108