第 1章 C语言入门 1
1.1 编写第 一个C程序 1
1.1.1 编译并运行程序 2
1.1.2 预处理器指令 3
1.1.3 main函数 3
1.1.4 检查函数返回值
1.1.5 格式化输出 5
1.2 编辑器和集成式开发环境 5
1.3 编译器 7
1.3.1 GNU编译器合集 7
1.3.2 Clang 8
1.3.3 Microsoft Visual Studio 8
1.4 可移植性 8
1.4.1 由实现定义的行为 9
1.4.2 未指定行为 9
1.4.3 未定义行为 10
1.4.4 特定区域设置行为和通用扩展 11
1.5 小结 11
第 2章 对象、函数和类型 12
2.1 对象、函数、类型和指针 12
2.2 声明变量 13
2.2.1 交换值(初次尝试)14
2.2.2 交换值(再次尝试) 15
2.3 作用域 17
2.4 存储期 18
2.5 对齐方式 19
2.6 对象类型 20
2.6.1 布尔类型 20
2.6.2 字符类型 21
2.6.3 数值类型 21
2.7 函数类型 23
2.8 派生类型 24
2.8.1 指针类型 24
2.8.2 数组 25
2.8.3 结构 27
2.8.4 联合 27
2.9 标签 28
2.10 类型限定符 30
2.10.1 const 30
2.10.2 volatile 31
2.10.3 restrict 32
2.11 练习 32
2.12 小结 32
第3章 算术类型 33
3.1 整数 33
3.1.1 填充和精度 33
3.1.2 头文件 34
3.1.3 声明整数 34
3.1.4 无符号整数 35
3.1.5 有符号整数 37
3.1.6 整数常量 41
3.2 浮点 42
3.2.1 浮点类型 42
3.2.2 浮点算术 44
3.2.3 浮点值 44
3.2.4 浮点常量 46
3.3 算术转换 46
3.3.1 整数转换等级 47
3.3.2 整数提升 48
3.3.3 寻常算术转换 49
3.3.4 隐式转换示例 50
3.3.5 安全转换 51
3.4 小结 52
第4章 表达式和运算符 53
4.1 简单赋值 53
4.2 求值 55
4.3 函数调用 55
4.4 递增运算符和递减运算符 56
4.5 运算符优先级和结合性 57
4.6 求值顺序 59
4.6.1 无序求值和不定序求值 60
4.6.2 顺序点 61
4.7 sizeof运算符 61
4.8 算术运算符 62
4.8.1 单目运算符 和- 62
4.8.2 逻辑否运算符 63
4.8.3 乘积运算符 63
4.8.4 累加运算符 64
4.9 按位运算符 64
4.9.1 求反运算符 65
4.9.2 移位运算符 65
4.9.3 按位与运算符 67
4.9.4 按位异或运算符 67
4.9.5 按位或运算符 68
4.10 逻辑运算符 68
4.11 转换运算符 70
4.12 条件运算符 71
4.13 _Alignof运算符 71
4.14 关系运算符 72
4.15 复合赋值运算符 73
4.16 逗号运算符 73
4.17 指针算术 74
4.18 小结 75
第5章 控制流 76
5.1 表达式语句 76
5.2 复合语句 77
5.3 选择语句 77
5.3.1 if语句 77
5.3.2 switch语句 80
5.4 迭代语句 83
5.4.1 while语句 83
5.4.2 do...while语句 84
5.4.3 for语句 85
5.5 跳转语句 87
5.5.1 goto语句 87
5.5.2 continue语句 89
5.5.3 break语句 89
5.5.4 return语句 90
5.6 练习 91
5.7 小结 91
第6章 动态分配内存 92
6.1 存储期 92
6.1.1 堆和内存管理器 93
6.1.2 什么时候使用动态分配内存 93
6.2 内存管理函数 94
6.2.1 malloc函数 94
6.2.2 aligned_alloc函数 96
6.2.3 calloc函数 97
6.2.4 realloc函数 97
6.2.5 reallocarray函数 99
6.2.6 free函数 100
6.3 内存状态 101
6.4 柔性数组成员 102
6.5 其他的动态分配内存 103
6.5.1 alloca函数 103
6.5.2 变长数组 104
6.6 调试存储分配问题 108
6.6.1 dmalloc 108
6.6.2 安全关键型系统 110
6.7 练习 110
6.8 小结 110
第7章 字符和字符串 111
7.1 字符 111
7.1.1 ASCII 112
7.1.2 Unicode 112
7.1.3 源字符集和执行字符集 113
7.1.4 数据类型 114
7.1.5 字符常量 116
7.1.6 转义序列 116
7.1.7 Linux 117
7.1.8 Windows 118
7.1.9 字符转换 119
7.2 字符串 123
7.3 字符串处理函数 125
7.3.1 和 126
7.3.2 附录K:边界检查接口 132
7.3.3 POSIX 134
7.3.4 Microsoft 135
7.4 小结 136
第8章 输入/输出 137
8.1 标准I/O流 137
8.1.1 流缓冲 138
8.1.2 预定义流 138
8.1.3 流倾向 140
8.1.4 文本流和二进制流 140
8.2 打开文件和创建文件 140
8.2.1 fopen函数 140
8.2.2 POSIX 的open函数 142
8.3 关闭文件 144
8.3.1 fclose函数 144
8.3.2 POSIX的close函数 145
8.4 读写字符和行 145
8.5 流冲洗 147
8.6 设置文件内部位置 148
8.7 删除文件和重命名文件 150
8.8 使用临时文件 151
8.9 读取格式化文本流 151
8.10 读写二进制流 154
8.11 小结 157
第9章 预处理器 159
9.1 编译过程 159
9.2 文件包含 160
9.3 条件包含 161
9.3.1 生成错误 162
9.3.2 头文件保护 163
9.4 宏定义 164
9.4.1 宏替换 167
9.4.2 泛型宏 169
9.4.3 预定义宏 169
9.5 小结 170
第 10章 程序结构 171
10.1 组件化原则 171
10.1.1 耦合和内聚 171
10.1.2 代码复用 172
10.1.3 数据抽象 172
10.1.4 不透明类型 173
10.2 可执行文件 174
10.3 链接 175
10.4 组织一个简单的程序 177
10.5 构建代码 181
10.6 小结 183
第 11章 调试、测试和分析 184
11.1 断言 184
11.1.1 静态断言 184
11.1.2 运行期断言 186
11.2 编译器设置和选项 188
11.2.1 GCC和Clang 188
11.2.2 Visual C 191
11.3 调试 192
11.4 单元测试 195
11.5 静态分析 198
11.6 动态分析 200
11.7 练习 204
11.8 小结 205
参考文献 206