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