本书是一本以正本清源为核心的C语言编程入门教材。作者针对市面上多数C语言教材存在的术语不规范、概念解释不清(如stdio.h、#include的本质)、重要规则缺失(如"表达式有值”)等问题,决心从C语言国际标准出发进行撰写。本书旨在清晰揭示C语言的本质,避免传承自早期非标准教材的模糊与混乱。它独树一帜地从计算机基本原理讲起,引导零基础读者构建正确的知识体系,并强调概念的逻辑严谨性(如弃用模糊的"变量”概念,严格采用"标识符”、"对象”、"左值”等标准术语),最终目标是为读者深入学习乃至直接阅读C语言标准文档打下坚实基础。
李忠,代表作《穿越计算机的迷雾》(第1版及第2版)、《x86汇编语言:从实模式到保护模式》、《x86汇编语言:编写64位多处理器多线程操作系统》等。
第1章 计算机和编程语言 1
1.1 用电表示数字 2
1.2 二进制加法机 4
1.3 具有记忆功能的器件——寄存器 5
1.4 带寄存器的加法机 7
1.5 能做四则运算的机器 8
1.6 机器指令 10
1.7 内存 13
1.8 自动计算 18
1.9 处理器 21
1.10 汇编语言的产生 24
1.11 高级语言的出现 27
本章习题 33
第2章 操作系统和C实现 35
2.1 计算机硬件 36
2.2 操作系统及其编程接口 37
2.2.1 为什么需要操作系统 38
2.2.2 操作系统的用户界面和编程接口 40
2.3 C实现 43
本章习题 50
第3章 输入输出、库和头文件 51
3.1 在Windows上播放音乐的小程序 52
3.2 库和库函数的例子 55
3.3 程序的编译、链接和执行 57
3.4 头文件和文件包含 61
3.5 C标准库 65
本章习题 68
第4章 从1加到100 70
4.1 从1加到100的第1种写法 71
4.1.1 注释 73
4.1.2 标识符和对象 74
4.1.3 表达式和语句 76
4.1.4 while语句 77
4.1.5 关系表达式 78
4.1.6 复合语句 79
4.1.7 复合赋值运算符 80
4.1.8 函数调用表达式 81
4.1.9 格式化输出 82
4.2 表达式的值和副作用 83
4.2.1 赋值表达式的值和副作用 84
4.2.2 运算符的结合性 87
4.2.3 关系运算符的值 88
4.2.4 加性运算符 89
4.2.5 乘性运算符 90
4.2.6 递增和递减运算符 90
4.3 从1加到100的第2种写法 93
4.3.1 初始化和初始化器 94
4.3.2 运算符的优先级 94
4.4 从1加到100的第3种写法 96
4.5 从1加到100的第4种写法 97
4.6 从1加到100的第5种写法 99
do语句 100
4.7 从1加到100的第6种写法 102
for语句 102
4.8 从1加到100的第7种写法 104
4.9 从1加到100的第8种写法 105
空语句 105
4.10 从1加到100的第9种写法 106
标识符的作用域 107
本章习题 109
第5章 Code::Blocks集成开发环境 111
5.1 下载和安装Code::Blocks 113
5.2 运行Code::Blocks 113
5.3 配置工具链 114
5.4 使用Code::Blocks编写和运行程序 115
5.5 在Code::Blocks里调试程序 120
第6章 更多的编程实例 124
6.1 打印表格 125
宏定义和宏替换 127
6.2 打印九九乘法表(之一) 129
6.3 打印九九乘法表(之二) 131
6.4 百钱百鸡问题 134
6.4.1 if语句 135
6.4.2 逻辑与、逻辑或和等性运算符 136
6.4.3 语法树 138
6.4.4 嵌套的if语句 139
6.5 寻找符合条件的三位自然数 140
6.5.1 括号表达式 142
6.5.2 摇摆的else子句 144
6.6 素数判定 145
6.6.1 标准整数类型 145
6.6.2 return语句 149
6.6.3 整数类型转换 152
6.6.4 整型常量 154
6.6.5 main函数的末尾可以省略return 0 156
6.6.6 函数原型 157
6.7 函数的递归调用 158
6.7.1 什么是递归 159
6.7.2 递归调用的原理 160
6.7.3 文件作用域 165
6.7.4 静态存储期 166
6.7.5 自动存储期 167
6.7.6 具有静态存储期且只在块内可见的对象 169
6.8 实浮点类型 171
6.8.1 标准浮点类型 171
6.8.2 十进制浮点类型 173
6.9 浮点常量 175
6.10 实浮点类型的应用实例 176
6.10.1 整数—实浮点类型的相互转换 177
6.10.2 实浮点类型的互相转换 178
本章习题 179
第7章 指针 180
7.1 一元&和一元*运算符 181
7.2 指针类型的对象 185
7.3 类型名和强制类型转换 189
7.4 左值和左值转换 193
7.5 参数类型为指针的函数 195
7.6 指向函数的指针 198
7.6.1 函数指示符-指针转换 199
7.6.2 指向函数的指针 200
7.7 返回指针的函数 203
条件表达式 205
7.8 指向指针的指针 206
7.9 const限定的类型 210
7.9.1 指向const限定类型的指针 212
7.9.2 const限定的指针(类型) 213
7.10 restrict限定的指针类型 215
7.11 空指针常量和空指针 219
7.12 格式化输入函数scanf 220
本章习题 223
第8章 数组 225
8.1 声明数组类型的对象 226
数组对象的初始化 228
8.2 数组元素的访问 230
8.2.1 运算符sizeof 231
8.2.2 类型定义 234
8.3 数组的应用:冒泡排序 238
8.4 指针运算 241
8.5 字符数组 246
8.5.1 字符集和字符编码 246
8.5.2 字符类型 249
8.5.3 字符常量 250
8.5.4 脱转序列 251
8.5.5 用putchar库函数打印字符 253
8.6 字符串 253
8.6.1 论程序的可读性 255
8.6.2 puts库函数 256
8.7 字面串 257
8.7.1 包含脱转序列的字面串 259
8.7.2 用作初始化器的字面串 260
8.8 指向数组的指针 263
8.9 变长数组 266
8.10 类型的兼容性 269
8.11 数组-指针转换 272
8.12 下标运算的本质是指针运算 274
8.13 printf和scanf库函数的原型 276
8.14 应用实例:字符串比较 277
strcmp标准库函数 283
8.15 应用实例:连接两个字符串 283
strcat和strcpy标准库函数 287
8.16 应用实例:打印对象的每字节的值 289
默认实参提升 291
8.17 元素类型为数组的数组 292
多维数组的初始化和访问 294
8.18 数组类型的参数 299
8.19 元素类型为指针的数组 301
8.20 main函数的原型和命令行参数 305
8.21 指向void的指针 314
本章习题 317
第9章 中文的输入和输出 318
9.1 字符、字符集和字符编码 319
9.2 ISO 2022和GB 2311字符代码结构标准 322
9.3 GB 2312字符集及其编码方案 324
9.4 EUC编码方案 326
9.5 GBK字符集及其编码方案 329
9.6 ISO 10646和Unicode 330
9.6.1 UCS的基本多语种平面 332
9.6.2 UCS的编码形式 333
9.6.3 字节序(大端和小端) 336
9.6.4 UCS的编码方案 339
9.7 字符集和字符编码的应用现状 343
9.8 GB 18030字符集及其编码方案 344
9.9 源字符集 345
9.10 多字节字符 346
9.11 执行字符集 347
9.12 C语言的国际化 349
9.13 宽字符 354
本章习题 359
第10章 结构、联合与枚举 360
10.1 结构类型 361
10.1.1 幂和平方根的标准库函数 363
10.1.2 结构成员的访问 364
10.1.3 结构类型的标记 364
10.1.4 库的链接 366
10.1.5 标准库的斜边函数 366
10.2 结构对象的内存布局 368
10.2.1 对齐和运算符alignof 369
10.2.2 函数式宏定义 371
10.2.3 宏运算符(预处理器记号)# 372
10.2.4 结构对象的内部和尾部填充 373
10.3 联合类型 376
10.4 联合的应用:打印float数值的位模式 379
10.4.1 常量表达式 380
10.4.2 逐位移动运算符 382
10.4.3 整型提升 386
10.4.4 逐位与运算符 388
10.4.5 常规算术转换 389
10.4.6 逐位或运算符 393
10.4.7 位精度整数类型 394
10.5 枚举类型和枚举常量 396
switch语句 400
10.6 结构、联合与枚举的应用实例 405
10.6.1 匿名结构和匿名联合 407
10.6.2 元素类型为结构的数组 410
10.6.3 逻辑与和逻辑或的短路效应 410
本章习题 415
第11章 链表和动态内存分配 416
11.1 学员信息管理 417
11.1.1 链表和自引用的结构 417
11.1.2 模块化、多文件的程序设计 421
11.1.3 条件包含 431
11.2 添加学员信息 433
11.2.1 动态内存分配 434
11.2.2 成员选择运算符“->” 436
11.2.3 逻辑反运算符 440
11.2.4 逗号运算符 443
11.2.5 goto语句 446
11.2.6 配方法在编程中的应用 448
11.3 打印学员信息 450
11.4 释放链表上的所有节点 452
本章习题 453
第12章 输入输出和文件操作 454
12.1 外部存储设备和文件 455
12.2 输入输出和流 456
12.2.1 文本流和二进制流 457
12.2.2 标准输入、标准输出和标准错误 461
12.2.3 输入输出的重定向 463
12.3 字符的输入输出函数 464
12.4 直接的输入输出 466
12.5 格式化输入输出函数 469
12.5.1 格式化输入scanf和fscanf函数 469
12.5.2 格式输出printf和fprintf函数 477
12.6 学员信息文件的读写 481
12.6.1 将学员信息写入文件 484
12.6.2 从文件读取学员信息 486
12.7 改进后的学员信息管理程序 488
第13章 学员信息管理系统 490
13.1 主程序的执行流程 491
13.1.1 显示系统主菜单 492
13.1.2 菜单的选择和处理 493
13.2 学员信息的删除 494
13.3 学员信息的查询 496
本章习题 503
附录A C语言类型系统全图 504
附录B C语言运算符一览表 506