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