第一部分 C语言 1
第1章 概述 1
1.1 C语言的演变 1
1.1.1 传统C 1
1.1.2 标准C(1989) 2
1.1.3 标准C(1995) 2
1.1.4 标准C(1999) 2
1.1.5 标准C++ 3
1.1.6 本书内容 3
1.2 应该使用哪种C语言 3
1.3 C编程概述 4
1.4 一致性 5
1.5 语法约定 6
第2章 词法元素 7
2.1 字符集 7
2.1.1 执行字符集 8
2.1.2 空白字符和行终止符 8
2.1.3 字符编码 9
2.1.4 三字符组 9
2.1.5 多字节字符和宽字符 10
2.2 注释 12
2.3 标记 13
2.4 操作符和分隔符 14
2.5 标识符 14
2.6 关键字 16
2.7 常量 17
2.7.1 整数常量 17
2.7.2 浮点数常量 21
2.7.3 字符常量 22
2.7.4 字符串常量 24
2.7.5 转义字符 26
2.7.6 字符转义码 27
2.7.7 数值转义码 28
2.8 C++兼容性 28
2.8.1 字符集 29
2.8.2 注释 29
2.8.3 操作符 29
2.8.4 标识符和关键字 29
2.8.5 字符常量 29
2.9 关于字符集、指令集和编码 29
2.10 练习 31
第3章 C预处理器 33
3.1 预处理器命令 33
3.2 预处理器词法约定 34
3.3 定义和替换 35
3.3.1 类似对象的宏定义 35
3.3.2 定义带参数的宏 36
3.3.3 宏表达式的重新扫描 38
3.3.4 预定义的宏 39
3.3.5 取消宏定义和重新定义宏 41
3.3.6 宏展开的优先级错误 41
3.3.7 宏参数的副作用 42
3.3.8 把标记转换为字符串 42
3.3.9 宏展开中的标记合并 43
3.3.10 宏的可变参数列表 44
3.3.11 其他问题 45
3.4 文件包含 45
3.5 条件编译 47
3.5.1 #if、#else和#endif命令 47
3.5.2 #elif命令 48
3.5.3 #ifdef和#ifndef命令 49
3.5.4 条件命令中的常量表达式 50
3.5.5 defined操作符 51
3.6 显式的行号 51
3.7 pragma指令 52
3.7.1 标准pragma命令 52
3.7.2 标准pragma指令的位置 53
3.7.3 _Pragma操作符 53
3.8 错误指令 53
3.9 C++兼容性 54
3.10 练习 54
第4章 声明 56
4.1 声明的组织形式 56
4.2 术语 57
4.2.1 作用域 57
4.2.2 可见性 58
4.2.3 前向引用 58
4.2.4 名称的重载 59
4.2.5 重复声明 60
4.2.6 重复可见性 61
4.2.7 范围 61
4.2.8 初始值 62
4.2.9 外部名称 63
4.2.10 编译时名称 64
4.3 存储类别和函数指定符 64
4.3.1 默认存储类别指定符 65
4.3.2 存储类别指定符的例子 65
4.3.3 函数指定符 66
4.4 类型指定符和限定符 66
4.4.1 默认类型指定符 67
4.4.2 缺失的声明器 68
4.4.3 类型限定符 69
4.4.4 const 69
4.4.5 volatile和序列点 71
4.4.6 restrict 73
4.5 声明器 74
4.5.1 简单声明器 74
4.5.2 指针声明器 75
4.5.3 数组声明器 76
4.5.4 函数声明器 77
4.5.5 声明器的组合 79
4.6 初始化值 80
4.6.1 整数 81
4.6.2 浮点数 82
4.6.3 指针 82
4.6.4 数组 83
4.6.5 枚举 85
4.6.6 结构 85
4.6.7 联合 86
4.6.8 省略花括号 87
4.6.9 指定成员的初始化值 87
4.7 隐式声明 88
4.8 外部名称 89
4.8.1 初始化值模型 89
4.8.2 省略的存储类别模型 89
4.8.3 公共模型 89
4.8.4 混合公共模型 90
4.8.5 总结和建议 90
4.8.6 未引用的外部声明 91
4.9 C++兼容性 91
4.9.1 作用域 91
4.9.2 标签和typedef名称 91
4.9.3 用于类型的存储类别指定符 92
4.9.4 const类型限定符 92
4.9.5 初始化值 92
4.9.6 隐式声明 92
4.9.7 定义和引用声明 93
4.9.8 函数链接 93
4.9.9 无参函数 93
4.10 练习 93
第5章 类型 96
5.1 整数类型 97
5.1.1 有符号整数类型 97
5.1.2 无符号整数类型 100
5.1.3 字符类型 101
5.1.4 扩展整数类型 103
5.1.5 布尔类型 103
5.2 浮点类型 103
5.3 指针类型 107
5.3.1 通用指针 108
5.3.2 null指针和非法指针 108
5.3.3 使用指针的一些警告 109
5.4 数组类型 110
5.4.1 数组和指针 110
5.4.2 多维数组 111
5.4.3 数组边界 111
5.4.4 操作 112
5.4.5 可变长度的数组 112
5.5 枚举类型 114
5.6 结构类型 116
5.6.1 结构类型引用 118
5.6.2 结构上的操作 119
5.6.3 成员 119
5.6.4 结构成员的布局 121
5.6.5 位段 121
5.6.6 移植性问题 123
5.6.7 结构的大小 124
5.6.8 灵活数组成员 125
5.7 联合类型 126
5.7.1 联合成员的布局 126
5.7.2 联合的大小 127
5.7.3 使用联合类型 128
5.7.4 (其他)使用联合类型 129
5.8 函数类型 130
5.9 void类型 132
5.10 typedef名称 132
5.10.1 用于函数类型的typedef名称 134
5.10.2 重定义typedef名称 134
5.10.3 编译器的说明 135
5.11 类型兼容性 135
5.11.1 等价的类型 135
5.11.2 枚举兼容性 136
5.11.3 数组兼容性 137
5.11.4 函数兼容性 137
5.11.5 结构和联合兼容性 138
5.11.6 指针兼容性 138
5.11.7 源文件之间的兼容性 138
5.12 类型名称和抽象声明器 138
5.13 C++兼容性 140
5.13.1 枚举类型 140
5.13.2 typedef名称 140
5.13.3 类型兼容性 140
5.14 练习 140
第6章 转换和表示形式 143
6.1 表示形式 143
6.1.1 存储单位和数据长度 143
6.1.2 字节顺序 144
6.1.3 对齐限制 145
6.1.4 指针的长度 146
6.1.5 地址模型的效果 146
6.1.6 类型表示形式 148
6.2 转换 149
6.2.1 表示形式的变化 149
6.2.2 细微的转换 149
6.2.3 转换为整数类型 149
6.2.4 转换为浮点类型 151
6.2.5 转换为结构和联合类型 151
6.2.6 转换为枚举类型 151
6.2.7 转换为指针类型 151
6.2.8 转换为数组和函数类型 152
6.2.9 转换为void类型 152
6.3 寻常转换 153
6.3.1 类型转换 153
6.3.2 赋值转换 153
6.3.3 寻常单目转换 154
6.3.4 寻常双目转换 156
6.3.5 默认的函数实参转换 157
6.3.6 其他函数转换 158
6.4 C++兼容性 158
6.5 练习 158
第7章 表达式 160
7.1 对象、左值和指示符 160
7.2 表达式和优先级 161
7.2.1 操作符的优先级和结合性 161
7.2.2 溢出和其他算术异常 162
7.3 基本表达式 163
7.3.1 名称 163
7.3.2 字面值 164
7.3.3 带括号的表达式 164
7.4 后缀表达式 165
7.4.1 下标表达式 165
7.4.2 成员选择 167
7.4.3 函数调用 168
7.4.4 后缀增值和减值操作符 170
7.4.5 复合字面值 171
7.5 单目表达式 172
7.5.1 类型转换 173
7.5.2 sizeof操作符 173
7.5.3 单目负号和正号 175
7.5.4 逻辑反 175
7.5.5 位反 176
7.5.6 取地址操作符 176
7.5.7 间接访问 177
7.5.8 前缀增值和减值操作符 178
7.6 双目操作符表达式 179
7.6.1 乘除操作符 179
7.6.2 加减操作符 181
7.6.3 移位操作符 182
7.6.4 关系操作符 184
7.6.5 相等操作符 185
7.6.6 位操作符 187
7.6.7 整数集合的例子 188
7.7 逻辑操作符表达式 191
7.8 条件表达式 193
7.9 赋值表达式 194
7.9.1 简单赋值 195
7.9.2 复合赋值 196
7.10 线性表达式 196
7.11 常量表达式 197
7.11.1 预处理器常量表达式 198
7.11.2 整型常量表达式 199
7.11.3 初始化值常量表达式 199
7.12 求值的顺序 200
7.13 被丢弃的值 201
7.14 内存访问的优化 202
7.15 C++兼容性 203
7.16 练习 203
第8章 语句 205
8.1 语句的基本语法规则 205
8.2 表达式语句 206
8.3 标签语句 206
8.4 复合语句 207
8.5 条件语句 209
8.5.1 多路条件语句 209
8.5.2 悬疑的else问题 210
8.6 迭代式语句 211
8.6.1 while语句 211
8.6.2 do语句 212
8.6.3 for语句 213
8.6.4 使用for语句 214
8.6.5 多个控制变量 216
8.7 switch语句 217
8.8 break和continue语句 219
8.9 return语句 221
8.10 goto语句 222
8.11 空语句 223
8.12 C++兼容性 223
8.12.1 复合语句 223
8.12.2 循环中的声明 223
8.13 练习 224
第9章 函数 225
9.1 数定义 225
9.2 函数原型 227
9.2.1 原型出现在什么时候 229
9.2.2 混合使用原型和非原型声明 229
9.2.3 合理地使用原型 230
9.2.4 原型和调用约定 230
9.2.5 标准C和传统C的兼容性 232
9.3 形式参数声明 232
9.4 形参类型的调整 234
9.5 参数传递约定 235
9.6 形参的一致 236
9.7 函数的返回类型 237
9.8 返回类型的一致 238
9.9 main函数 238
9.10 内联函数 239
9.11 C++兼容性 241
9.11.1 原型 241
9.11.2 形参和返回类型中的类型声明 241
9.11.3 返回类型的一致 241
9.11.4 main 241
9.11.5 内联 242
9.12 练习 242
第二部分 C函数库第10章 函数库简介 245
10.1 标准C工具 245
10.2 C++兼容性 244
10.3 库头文件和名称 248
10.3.1 assert.h 248
10.3.2 complex.h 248
10.3.3 ctype.h 248
10.3.4 errno.h 248
10.3.5 fenv.h 248
10.3.6 float.h 249
10.3.7 inttypes.h 249
10.3.8 iso64.h 249
10.3.9 limits.h 249
10.3.10 locale.h 249
10.3.11 math.h 250
10.3.12 setjmp.h 251
10.3.13 signal.h 251
10.3.14 stdarg.h 251
10.3.15 stdbool.h 251
10.3.16 stddef.h 251
10.3.17 stdint.h 251
10.3.18 stdio.h 251
10.3.19 stdlib.h 252
10.3.20 string.h 252
10.3.21 tgmath.h 252
10.3.22 time.h 253
10.3.23 wchar.h 253
10.3.24 wctype.h 253
第11章 标准语言附加 254
11.1 NULL、ptrdiff_t、size_t、offsetof 254
11.2 EDOM、ERANGE、EILSEQ、errno、strerror、perror 255
11.3 bool、false、true 256
11.4 va_list、va_start、va_arg、va_end 257
11.5 标准C的操作符宏 260
第12章 字符处理 261
12.1 isalnum、isalpha、iscntrl、iswalnum、iswalpha iswcntrl 261
12.2 iscsym iscsymf 263
12.3 isdigit、isodigit、isxdigit、iswdigit、iswxdigit 263
12.4 isgraph、isprint、ispunct、iswgraph、iswprint、iswpunct 264
12.5 islower、isupper、iswlower、iswupper 265
12.6 isblank、isspace、iswhite、iswspace 265
12.7 toascii 266
12.8 toint 266
12.9 tolower、toupper、towlower、towupper 266
12.10 wctype_t、wctype、iswctype 267
12.11 wctrans_t、wctrans 268
第13章 字符串处理 269
13.1 strcat、strncat、wcscat、wcsncat 269
13.2 strcmp、strncmp、wcscmp、wcsncmp 270
13.3 strcpy、strncpy、wcscpy、cscncpy 271
13.4 strlen、wcslen 272
13.5 strchr、strrchr、wcschr、wcsrchr 272
13.6 strspn、strcspn、strpbrk、strrpbrk、wcsspn、wcscspn、wcspbrk 273
13.7 strstr、strtok、wcsstr、wcstok 274
13.8 strtod、strtof、strtold、strtol、strtoll、strtoul、strtoull 275
13.9 atof、atoi、atol、atoll 276
13.10 strcoll、strxfrm、wcscoll、wcsxfrm 276
第14章 内存函数 278
14.1 memchr、wmemchr 278
14.2 memcmp、wmemcmp 278
14.3 memcpy、memccpy、memmove、wmemcpy、wmemmove 279
14.4 memset、wmemset 280
第15章 输入/输出工具 281
15.1 FILE、EOF、wchar_t、WEOF 282
15.2 fopen、fclose、fflush、freopen、fwide 283
15.2.1 文件模式 284
15.2.2 文件的定向 285
15.3 setbuf、setvbuf 286
15.4 stdin、stdout、stderr 286
15.5 fseek、ftell、rewind、fgetpos、fsetpos 287
15.5.1 fseek和ftell 287
15.5.2 fgetpos和fsetpos 289
15.6 fgetc、fgetwc、getc、getwc、getchar、getwchar、ungetc、ungetwc 289
15.7 fgets、fgetws、gets 290
15.8 fscanf、fwscanf、scanf、wscanf、sscanf swscanf 291
15.8.1 控制字符串 292
15.8.2 转换规范 292
15.9 fputc、fputwc、putc、putwc、putchar、putwchar 297
15.10 fputs、fputws、puts 298
15.11 fprintf、printf、sprintf、snprintf、fwprintf、wprintf、swprintf 298
15.11.1 输出格式 299
15.11.2 转换规范 300
15.11.3 转换标志 300
15.11.4 最小字段宽度 301
15.11.5 精度 302
15.11.6 长度规范 302
15.11.7 转换操作 303
15.12 v[x]printf v[x]scanf 310
15.13 fread、fwrite 311
15.14 feof、ferror、clearerr 312
15.15 remove、rename 313
15.16 tmpfile、tmpnam、mktemp 313
第16章 基本工具 315
16.1 malloc、calloc、mlalloc、clalloc、free、cfree 315
16.2 rand、srand、RAND_MAX 317
16.3 atof、atoi、atol、atoll 318
16.4 strtod、strtof、strtold、strtol、strtoll、strtoul strtoull 318
16.5 abort、atexit、exit、_Exit、EXIT_FAILURE、EXIT_SUCCESS 320
16.6 getenv 321
16.7 system 322
16.8 bsearch、qsort 322
16.9 abs、labs、llabs、div、ldiv、lldiv 324
16.10 mblen、mbtowc、wctomb 326
16.10.1 编码和转换状态 326
16.10.2 长度函数 326
16.10.3 转换为宽字符 326
16.10.4 宽字符转换为多字节字符 327
16.11 mbstowcs、wcstombs 327
16.11.1 转换为宽字符串 327
16.11.2 从宽字符串转换为多字节字符 328
第17章 数学函数 330
17.1 abs、lbas、llabs、div、ldiv、lldiv 330
17.2 fabs 331
17.3 ceil、floor、lrint、llrint、lround、llround、nearbyint、round、rint、trunc 331
17.4 fmod、remainder、remquo 332
17.5 frexp、ldexp、modf、scalbn 332
17.6 exp、exp2、expm1、ilogb、log、log10、log1p、log2、logb 333
17.7 cbrt、fma、hypot、pow、sqrt 334
17.8 rand、srand、RAND_MAX 335
17.9 cos、sin、tan、cosh、sinh、tanh 335
17.10 acos、asin、atan、atan2、acosh、asinh、atanh 336
17.11 fdim、fmax、fmin 337
17.12 类型通用的宏 337
17.13 erf、erfc、lgamma、tgamma 340
17.14 fpclassify、isfinite、isinf、isnan、isnormal、signbit 341
17.15 copysign、nan、nextafter、nexttoward 342
17.16 isgreater、isgreaterequal、isless、islessequal、islessgreater、isunordered 342
第18章 时间和日期函数 344
18.1 clock、clock_t、CLOCKS_PER_SEC、times 344
18.2 time、time_t 345
18.3 asctime、ctime 345
18.4 gmtime、localtime、mktime 346
18.5 difftime 347
18.6 strtime、wcsftime 348
第19章 控制函数 351
19.1 assert、NDEBUG 351
19.2 system、exec 351
19.3 exit、abort 352
19.4 setjmp、longjmp、jmp_buf 352
19.5 atexit 353
19.6 signal、raise、gsignal、ssignal、psignal 353
19.7 sleep、alarm 355
第20章 区域 356
20.1 setlocale 356
20.2 localeconv 357
第21章 扩展整数类型 360
21.1 基本规则 360
21.1.1 类型的种类 360
21.1.2 要么都定义,要么都不定义 360
21.1.3 MIN和MAX限制 360
21.1.4 PRI…和SCN…格式字符串宏 361
21.2 固定长度的整数类型 362
21.3 具有最小宽度的最小长度类型 363
21.4 具有最小宽度的快速类型 363
21.5 指针长度和最大长度整数类型 364
21.6 ptrdiff_t、size_t、wchar_t、wint_t和sig_atomic_t的范围 365
21.7 imaxabs、imaxdiv、imaxdiv_t 365
21.8 strtoimax、strtouimax 366
21.9 wcstoimax、wcstoumax 366
第22章 浮点环境 367
22.1 介绍 367
22.2 浮点环境 368
22.3 浮点异常 368
22.4 浮点四舍五入模式 369
22.5 浮点表达式收缩 370
第23章 复数运算 371
23.1 复数函数库约定 371
23.2 complex、_Complex_I、imaginary、_Imaginary_I、I 371
23.3 CX_LIMITED_RANGE 371
23.4 cacos、casin、catan、ccos、csin、ctan 372
23.5 cacosh、casinh、catanh、ccosh、csinh、ctanh 373
23.6 cexp、clog、cabs、cpow、csqrt 373
23.7 carg、cimag、creal、conj、cproj 374
第24章 宽字符和多字节字符工具 376
24.1 基本类型和宏 376
24.2 宽字符和多字节字符之间的转换 376
24.3 宽字符串和多字节字符串之间的转换 378
24.4 转换为算术类型 379
24.5 输入和输出函数 379
24.6 字符串函数 380
24.7 日期和时间转换 381
24.8 宽字符分类和映射函数 381
附录A ASCII字符集 382
附录B 语法 383
附录C 练习答案 395