(第 5 版)
: 本书中文简体字版由 Apress 出版公司授权清华大学出版社出版。未经出版者书面许可,不得以任何方
式复制或抄袭本书内容。
北京市版权局著作权合同登记号 图字: 01-2013-5119
本书封面贴有清华大学出版社防伪标签,无标签者不得销售。
版权所有,侵权必究。侵权举报电话: 图书在版编目数据
C 语言入门经典(第 5 版) / (美) 霍尔顿(Horton, I.) 著;杨浩 译. —北京:清华大学出版社, 2013
(2018.5 重印)
书名原文: Beginning C, Fifth Edition
ISBN 978-7-302-34341-7
Ⅰ. ①C… Ⅱ. ①霍… ②杨… Ⅲ. ①C 语言—程序设计 Ⅳ. ①TP312
中国版本图书馆 CIP 数据核字(2013)第 255156 号
责任编辑:王 军 于 平
装帧设计:牛艳敏
责任校对:邱晓玉
责任印制:沈 露
出版发行:清华大学出版社
网 址: http://www.tup.com.cn, http://www.wqbook.com
地 址:北京清华大学学研大厦 A 座 邮 编: 100084
社 总 机: 010-62770175 邮 购: 010-62786544
投稿与读者服务: 010-62776969, c-service@tup.tsinghua.edu.cn
质 量 反 馈: 010-62772015, zhiliang@tup.tsinghua.edu.cn
印 刷 者:清华大学印刷厂
装 订 者:三河市溧源装订厂
经 销:全国新华书店
开 本: 185mm×260mm 印 张: 37.75 字 数: 872 千字
版 次: 2013 年 11 月第 1 版 印 次: 2018 年 5 月第 18 次印刷
印 数: 62001~67000
定 价: 79.80 元
————————————————————————————————————————————
产品编号: 052455-02
原本是一名数学家,因听闻信息技术工作轻松且收入丰厚而踏足其中。
尽管现实情况常常是工作辛苦且收入相对一般, 但他至今依然坚持从事计算机工作。 Ivor
在不同的时期从事过各种类型的工作,包括程序设计、系统设计、咨询顾问以及管理和
实现一些颇为复杂的项目。 Ivor 对于将计算机系统设计和实现应用在各种行业工程设计
和运营管理方面有着十分丰富的经验。他能够运用多种编程语言开发特定用途的应用程
序,同时还为科研人员和工程人员提供教学,以帮助他们完成这类工作。多年来,他一
直撰写编程方面的书籍,近期作品包括 C、 C++和 Java 教程。在写书与指导他人之余,
一般他会选择钓鱼、旅行和享受生活。
是一名来自比利时的软件工程师。他毕业于比利时天主教鲁汶大
学(Catholic University of Leuven),并拥有该校的计算机工程学硕士学位。一年后,他以
优异成绩获得了同一所大学的人工智能专业硕士学位。毕业后, Marc 开始在一家名为
Ordina Belgium 的软件咨询公司工作。作为一名咨询师,他主要为西门子及诺基亚西门
子网络公司提供服务, 工作内容包括帮助电信运营商在 Solaris 上运行关键性的 2G 与 3G
软件。这项工作需要身处国际范围的团队(跨度从南美地区和美国到欧洲、中东地区、非
洲以及亚洲)中完成。现在, Marc 在 Nikon Metrology 从事 3D 激光扫描软件开发工作。
Marc 在 C/C++方面经验丰富,尤其精通 Microsoft VC++和 MFC 框架。此外, Marc
也喜爱 C#,并使用 PHP 创建网页。除了主要对 Windows 开发感兴趣之外, Marc 还对开
发 Linux 平台上 24/7 全天候运行的 C++程序颇有心得(例如, EIB 家庭自动化软件)。
自 2007 年 4 月起,Marc 就因他在 Visual C++方面的丰富经验而屡屡荣获每年的 Microsoft
的年度 MVP(Most Valuable Professional,最有价值专家)奖。
Marc 是比利时 C++用户群组(www.becpp.org)的创始人,并经常以 Marc G 的代号活
跃在 CodeGuru 论坛中。他还创建了一些免费软件和共享软件,并发布在了他的网站
www.nuonsoft.com 上。此外, Marc 还在 www.nuonsoft.com/blog/上维护自己的博客。
作者只不过是一个大型团队中将书复印成册之人。我想感谢整个 Apress 编辑部与产
品组自始至终的帮助与支持。我要感谢 Jonathan Gennick 对于启动本书新版本所做的努力,
感谢 Jill Balzano 在整个编辑过程中耐心地帮助解决我遇到的各种难题。
我还要感谢我的技术编辑 Marc Gregoire,感谢他帮助审核文字和检查所有的代码片
段与示例。他找错的本领实在了得,他的许多建设性的评论与深思熟虑的建议无疑使本
书变成了一本更好的教程。
欢迎使用《C 语言入门经典(第 5 版)》。研读本书,你就可以成为一位称职的 C 语言
程序员。从许多方面来说, C 语言都是学习程序设计的理想起步语言。 C 语言很简洁,
因此无须学习大量的语法便能够开始编写真正的应用程序。除了简明易学以外,它还是
一门功能非常强大的语言,并被专业人士广泛应用在各种领域。 C 语言的强大之处主要
体现在,它能够应用于各类层次的开发中,从设备驱动程序和操作系统组件到大规模应
用程序,它都能胜任。此外, C 语言还可以适用于相对较新的手机应用程序开发上。
几乎所有计算机都包含 C 语言编译器,因此,当你学会了 C 语言,就可以在任何环
境下进行编程。 最后一点, 掌握 C 语言可以为理解面向对象的 C++语言奠定良好的基础。
在作者眼中,有抱负的程序员必将面对三重障碍,即掌握遍布程序设计语言中的各
类术语、理解如何使用语言元素(而不仅仅只是知道它们的概念)以及领会如何在实际场
景中应用该语言。本书的目的就是将这些障碍降到最低限度。
术语是专业人士及优秀业余爱好者之间的交流必不可少的,因此有必要掌握它们。
本书将确保你理解这些术语,并自如地在各种环境下使用它们。这样才能更有效地使用
大多数软件产品附带的文档,且能轻松地阅读和学习大部分程序设计语言相关的著作。
理解语言元素的语法和作用固然是学习 C 语言过程中的一个重要部分,但认识语言
特性如何工作及应用也同等重要。本书不仅采用了代码片段,还在每个章节中使用一些
实际应用示例展示语言特性如何应用于特定的问题。这些示例提供了实践的基础,读者
可以通过改动代码观察修改后的结果。
理解特定背景下的程序设计不仅只是应用个别语言元素。为了帮助读者理解它们,
本书大部分章节之后都给出了一个较为复杂的应用程序,以应用本章之前学到的知识。
这些程序可以帮助你获得开发应用程序的能力与信心,了解如何联合以及更大范围地应
用语言元素。最重要的是,它们能让你了解设计实际应用程序与管理实际代码会碰到的
问题。
不管学习什么程序设计语言,有几件事情都要意识到。首先,虽然要学的东西很多,
但是掌握它们之后,你就会有极大的成就感。其次,学习的过程很有趣,你会深深地体
会到这点;第三,只有通过动手实践才能学会编程,这也是本书贯彻的思想。最后,在
学习的过程中,肯定会时不时犯许多错误和感到沮丧。当觉得自己完全停滞时,你要做
的就是坚持。最终你一定会体验到成功的喜悦,并且回头想想时,你会觉得它也并没有
你想象中的那么难。如何使用本书
作者认为动手实践是学习编程最好的方法,很快你就会编写第一个程序了。每一章
都会有几个将理论应用于实践的程序,它们也是本书的核心所在。建议读者手工键入并
运行书中的示例,因为手工键入可以极大地帮助记忆语言元素。此外,你还应当尝试解
决每章末尾的所有练习题。当你第一次将一个程序运行成功,尤其是在解决自己的问题
后,你会感觉到很大的成就感和惊人的进步速度,那时你一定会觉得一切都挺值得。
刚开始,学习的进展不会太快,不过随着逐渐深入,你的学习速度会越来越快。每
一章都会涉及许多基础知识,因此在学习新的内容之前,需要花些时间确保理解前面学
习过的所有知识。实践各部分的代码,并尝试实现自己的想法,这是学习程序设计语言
的一个重要部分。尝试修改书中的程序,看看还能让它们做些什么,那才是有趣之处。
不要害怕尝试,如果某些地方不太明白,尝试输入一些变体,看看会出现什么情况。出
错并没什么大不了,你会从出错中学到很多知识。一个不错的方法是彻底通读每一章,
了解各章的范围,然后回过头来过一遍所有的示例。
你可能会觉得某些章末尾的练习题非常难。如果第一次没有完全搞明白,不用担心。
之所以第一次觉得困难是因为它们通常都是将你所学的知识应用到了相对复杂的问题
中。如果你实在觉得困难的话,可以略过它们继续学习下一章,然后再回头研究这些程
序。你甚至可以阅读完整本书再考虑它们。尽管如此,如果你能完成练习的话,说明你
取得了真正的进步。
本书读者对象
《C 语言入门经典(第 5 版)》的目的是教会读者如何尽可能简单快速地编写有用的
程序。在阅读完全书后,读者会彻底了解 C 语言编程。这本教程面向的是那些之前编过
一些程序,了解背后的概念,并且希望通过学习 C 语言进一步扩展知识的读者。尽管如
此,本书并未假设读者拥有先前的编程知识,因此如果你刚刚接触编程,本书依然是你
的不错选择。
使用本书的条件
要使用本书,你需要一台安装 C 编译器和库的计算机以执行书中的示例,以及一个
程序文本编译器用于创建源代码文件。你使用的编译器应支持目前 C 语言国际标准
(ISO/IEC 9899:2011,也被称为 C11)。你还需要一个用于创建和修改代码的编辑器,可以
采用纯文本编辑器(如记事本(Notepad)或 vi)创建源文件。不过,采用专为编辑 C 语言代
码设计的编辑器会更有帮助。
以下是作者推荐的两款 C 语言编译器,均为免费软件:
● GNU C 编译器, GCC,可从 http://www.gnu.org 下载,它支持多种不同的操作系统
环境。
● 面向 Microsoft Windows 的 Pelles C 编译器,可从 http://www.smorgasbordet.com/
pellesc/下载,它提供了一个非常棒的集成开发环境(IDE)。
本书采用的约定
本书的文本和布局采用了许多不同的样式,以便区分各种不同的信息。大多数样式
表达的含义都很明显。程序代码样式如下:
如果代码片段是从前面的实例修改而来,修改过的代码行就用粗体显示,如下所示:
i 当代码出现在文本中时,它的样式会有所不同,如: double。
程序代码中还是用了各种“括号”。它们之间的差别非常重要,不同称呼。本书中称
()为圆括号, {}为大括号, []为方括号。
第 章 语言编程 1.1 C 语言 .........................................1
1.2 标准库.........................................2
1.3 学习 C .........................................2
1.4 创建 C 程序 ................................2
1.4.1 编辑 ........................................ 2
1.4.2 编译 ........................................ 3
1.4.3 链接 ........................................ 4
1.4.4 执行 ........................................ 4
1.5 创建第一个程序.........................5
1.6 编辑第一个程序.........................5
1.7 处理错误.....................................6
1.8 剖析一个简单的程序.................7
1.8.1 注释 ........................................ 7
1.8.2 预处理指令 ............................ 8
1.8.3 定义 main()函数..................... 9
1.8.4 关键字 ..................................10
1.8.5 函数体 ..................................10
1.8.6 输出信息 ..............................11
1.8.7 参数 ......................................11
1.8.8 控制符 ..................................11
1.8.9 三字母序列 ..........................13
1.9 预处理器...................................14
1.10 用 C 语言开发程序 ................14
1.10.1 了解问题 ............................14
1.10.2 详细设计 ............................15
1.10.3 实施 ....................................15
1.10.4 测试 ....................................15
1.11 函数及模块化编程 .................16
1.12 常见错误.................................19
1.13 要点.........................................19
1.14 小结.........................................20
1.15 习题.........................................20
第 章 编程初步 2.1 计算机的内存 ...........................21
2.2 什么是变量 ...............................23
2.3 存储整数的变量 .......................24
2.3.1 变量的使用 ..........................28
2.3.2 变量的初始化 ......................29
2.4 变量与内存 ...............................36
2.4.1 带符号的整数类型 ..............36
2.4.2 无符号的整数类型 ..............37
2.4.3 指定整数常量 ......................37
2.5 使用浮点数 ...............................39
2.6 浮点数变量 ...............................41
2.6.1 使用浮点数完成除法
运算 ......................................42
2.6.2 控制输出中的小数位数 ......43
2.6.3 控制输出的字段宽度 ..........43
2.7 较复杂的表达式 .......................44
2.8 定义命名常量 ...........................46
2.8.1 极限值 ..................................49
2.8.2 sizeof 运算符........................51
2.9 选择正确的类型 .......................52
2.10 强制类型转换 .........................55
2.10.1 自动转换类型 ....................56
2.10.2 隐式类型转换的规则 ........56
2.10.3 赋值语句中的隐式类型
转换 ......................................57
2.11 再谈数值数据类型 .................58
2.11.1 字符类型 ............................58
2.11.2 字符的输入输出 ................59
2.11.3 枚举 ....................................62
2.11.4 存储布尔值的变量 ............64
2.12 赋值操作的 op=形式..............65
2.13 数学函数 .................................662.14 设计一个程序.........................67
2.14.1 问题 ..................................68
2.14.2 分析 ..................................68
2.14.3 解决方案 ..........................70
2.15 小结.........................................73
2.16 练习.........................................74
第 3 章 条件判断...............................75
3.1 判断过程...................................75
3.1.1 算术比较 ..............................75
3.1.2 基本的 if 语句 ......................76
3.1.3 扩展 if 语句: if-else ............79
3.1.4 在 if 语句中使用代码块 ......82
3.1.5 嵌套的 if 语句 ......................83
3.1.6 测试字符 ..............................85
3.1.7 逻辑运算符 ..........................88
3.1.8 条件运算符 ..........................91
3.1.9 运算符的优先级...................94
3.2 多项选择问题...........................98
3.2.1 给多项选择使用 else-if
语句 ......................................98
3.2.2 switch 语句 ...........................99
3.2.3 goto 语句 ........................... 107
3.3 按位运算符.............................108
3.3.1 按位运算符的 op=用法 .....110
3.3.2 使用按位运算符.................111
3.4 设计程序................................. 114
3.4.1 问题 ....................................114
3.4.2 分析 ....................................114
3.4.3 解决方案 ............................114
3.5 小结......................................... 118
3.6 练习......................................... 118
第 4 章 循环.................................... 119
4.1 循环......................................... 119
4.2 递增和递减运算符.................120
4.3 for 循环 ...................................120
4.4 for 循环的一般语法 ...............124
4.5 再谈递增和递减运算符.........125
4.5.1 递增运算符 ........................125
4.5.2 递增运算符的前置和后置
形式 ....................................125
4.5.3 递减运算符 ........................126
4.6 再论 for 循环 ..........................127
4.6.1 修改 for 循环变量..............129
4.6.2 没有参数的 for 循环..........129
4.6.3 循环内的 break 语句..........130
4.6.4 使用 for 循环限制输入......132
4.6.5 生成伪随机整数 ................135
4.6.6 再谈循环控制选项 ............137
4.6.7 浮点类型的循环控制
变量 ....................................137
4.7 while 循环 ...............................138
4.8 嵌套循环 .................................140
4.9 嵌套循环和 goto 语句 ............146
4.10 do-while 循环........................147
4.11 continue 语句.........................149
4.12 设计程序 ...............................150
4.12.1 问题 ...............................150
4.12.2 分析 ...............................150
4.12.3 解决方案 .......................151
4.13 小结 .......................................162
4.14 习题 .......................................163
第 5 章 数组 ................................... 165
5.1 数组简介 .................................165
5.1.1 不用数组的程序 ................165
5.1.2 什么是数组 ........................167
5.1.3 使用数组 ............................168
5.2 寻址运算符 .............................171
5.3 数组和地址 .............................173
5.4 数组的初始化 .........................174
5.5 确定数组的大小 .....................175
5.6 多维数组 .................................176
5.7 多维数组的初始化 .................178
5.8 变长数组 .................................184
5.9 设计一个程序 .........................186
5.9.1 问题 ................................... 186
5.9.2 分析 ................................... 186
5.9.3 解决方案 ........................... 187
5.10 小结.......................................193
5.11 习题.......................................193
第 6 章 字符串和文本的应用...........195
6.1 什么是字符串.........................195
6.2 存储字符串的变量.................197
字符串数组 ................................... 199
6.3 字符串操作.............................202
6.3.1 检查对 C11 的支持 ........... 202
6.3.2 确定字符串的长度............ 203
6.3.3 复制字符串 ....................... 204
6.3.4 连接字符串 ....................... 204
6.3.5 比较字符串 ....................... 208
6.3.6 搜索字符串 ........................211
6.3.7 单元化字符串.................... 215
6.3.8 将换行符读入字符串........ 219
6.4 分析和转换字符串.................221
6.4.1 转换字符的大小写形式.... 223
6.4.2 将字符串转换成数值........ 225
6.5 设计一个程序.........................227
6.5.1 问题 ................................... 227
6.5.2 分析 ................................... 227
6.5.3 解决方案 ........................... 228
6.6 小结.........................................233
6.7 习题.........................................233
第 7 章 指针....................................235
7.1 指针初探.................................235
7.1.1 声明指针 ........................... 236
7.1.2 通过指针访问值................ 237
7.1.3 使用指针 ........................... 240
7.1.4 指向常量的指针................ 244
7.1.5 常量指针 ........................... 244
7.1.6 指针的命名 ....................... 245
7.2 数组和指针.............................245
7.3 多维数组.................................248
7.3.1 多维数组和指针 ................252
7.3.2 访问数组元素 ....................253
7.4 内存的使用 .............................256
7.4.1 动态内存分配: malloc()
函数 ....................................256
7.4.2 释放动态分配的内存 ........257
7.4.3 用 calloc()函数分配
内存 ....................................261
7.4.4 扩展动态分配的内存 ........262
7.5 使用指针处理字符串 .............265
7.5.1 使用指针数组 ....................266
7.5.2 指针和数组记号 ................272
7.6 设计程序 .................................276
7.6.1 问题 ....................................276
7.6.2 分析 ....................................277
7.6.3 解决方案 ............................277
7.7 小结 .........................................284
7.8 习题 .........................................285
第 8 章 编程的结构 ........................ 287
8.1 程序的结构 .............................287
8.1.1 变量的作用域和生存期 ....288
8.1.2 变量的作用域和函数 ........291
8.2 函数 .........................................291
8.2.1 定义函数 ............................291
8.2.2 return 语句..........................294
8.3 按值传递机制 .........................299
8.4 函数原型 .................................300
8.5 指针用作参数和返回值 .........301
8.5.1 常量参数 ............................302
8.5.2 返回指针的风险 ................307
8.6 小结 .........................................310
8.7 习题 .........................................310
第 9 章 函数再探 ............................ 313
9.1 函数指针 .................................313
9.1.1 声明函数指针 ....................313
9.1.2 通过函数指针调用函数 ....314
9.1.3 函数指针的数组 ................3169.1.4 作为变元的函数指针........ 319
9.2 函数中的变量.........................321
9.2.1 静态变量:函数内部
的追踪 ............................... 321
9.2.2 在函数之间共享变量........ 323
9.3 调用自己的函数:递归.........325
9.4 变元个数可变的函数.............328
9.4.1 复制 va_list........................ 331
9.4.2 长度可变的变元列表
的基本规则 ....................... 331
9.5 main()函数 ..............................332
9.6 结束程序.................................333
9.6.1 abort()函数......................... 333
9.6.2 exit()和 atexit()函数 .......... 333
9.6.3 _Exit()函数 ........................ 334
9.6.4 quick_exit()和 at_quick_exit()
函数 ................................... 334
9.7 提高性能.................................335
9.7.1 内联声明函数.................... 335
9.7.2 使用 restrict 关键字........... 335
9.7.3 _Noreturn 函数限定符 ...... 336
9.8 设计程序.................................336
9.8.1 问题 ................................... 336
9.8.2 分析 ................................... 337
9.8.3 解决方案 ........................... 338
9.9 小结.........................................351
9.10 习题.......................................352
第 10 章 基本输入和输出操作.........353
10.1 输入和输出流.......................353
10.2 标准流...................................354
10.3 键盘输入...............................354
10.3.1 格式化键盘输入 ........... 355
10.3.2 输入格式控制字符串 ... 355
10.3.3 输入格式字符串中
的字符 ........................... 360
10.3.4 输入浮点数的各种
变化 ............................... 362
10.3.5 读取十六进制和八进
制值................................363
10.3.6 用 scanf_s()读取字符 ....364
10.3.7 从键盘上输入字符串 ....366
10.3.8 单个字符的键盘输入 ....367
10.4 屏幕输出 ...............................372
10.4.1 使用 printf_s()的格式化
输出................................372
10.4.2 转义序列........................375
10.4.3 整数输出........................375
10.4.4 输出浮点数....................378
10.4.5 字符输出........................379
10.5 其他输出函数 .......................380
10.5.1 屏幕的非格式化输出 ....381
10.5.2 数组的格式化输出 ........381
10.5.3 数组的格式化输入 ........382
10.6 小结 .......................................382
10.7 习题 .......................................383
第 11 章 结构化数据....................... 385
11.1 数据结构:使用 struct..........385
11.1.1 定义结构类型和结构
变量................................387
11.1.2 访问结构成员 ................388
11.1.3 未命名的结构 ................390
11.1.4 结构数组 ........................391
11.1.5 表达式中的结构成员 ....393
11.1.6 结构指针 ........................393
11.1.7 为结构动态分配内存 ....394
11.2 再探结构成员 .......................397
11.2.1 将一个结构作为另一个
结构的成员....................397
11.2.2 声明结构中的结构 ........398
11.2.3 将结构指针用作结构
成员................................399
11.2.4 双向链表 ........................403
11.2.5 结构中的位字段 ............406
11.3 结构与函数 ...........................407
11.3.1 结构作为函数的变元.... 407
11.3.2 结构指针作为函数
变元 ............................... 408
11.3.3 作为函数返回值的
结构 ............................... 409
11.3.4 二叉树 ........................... 414
11.4 共享内存...............................421
11.5 设计程序...............................425
11.5.1 问题 ............................... 425
11.5.2 分析 ............................... 426
11.5.3 解决方案 ....................... 426
11.6 小结.......................................438
11.7 习题.......................................438
第 12 章 处理文件...........................441
12.1 文件的概念...........................441
12.1.1 文件中的位置 ............... 442
12.1.2 文件流 ........................... 442
12.2 文件访问...............................442
12.2.1 打开文件 ....................... 443
12.2.2 缓存文件操作 ............... 445
12.2.3 文件重命名 ................... 446
12.2.4 关闭文件 ....................... 447
12.2.5 删除文件 ....................... 447
12.3 写入文本文件.......................448
12.4 读取文本文件.......................449
12.5 在文本文件中读写
字符串 ..................................452
12.6 格式化文件的输入输出.......456
12.6.1 格式化文件输出 ........... 456
12.6.2 格式化文件输入 ........... 457
12.7 错误处理...............................459
12.8 再探文本文件操作模式.......460
12.9 freopen_s()函数 ....................461
12.10 二进制文件的输入输出.....462
12.10.1 以二进制模式打开
文件........................... 462
12.10.2 写入二进制文件 ....... 463
12.10.3 读取二进制文件........464
12.11 在文件中移动 .....................469
12.11.1 文件定位操作............469
12.11.2 找出我们在文件中
的位置........................470
12.11.3 在文件中设定位置....471
12.12 使用临时文件 .....................477
12.12.1 创建临时文件............477
12.12.2 创建唯一的文件名....478
12.13 更新二进制文件 .................479
12.13.1 修改文件的内容........484
12.13.2 从键盘输入创建
记录 ...........................485
12.13.3 将记录写入文件........486
12.13.4 从文件中读取记录....486
12.13.5 写入文件....................487
12.13.6 列出文件内容............488
12.13.7 更新已有的文件
内容 ...........................489
12.14 文件打开模式小结 .............495
12.15 设计程序 .............................496
12.15.1 问题 ...........................496
12.15.2 分析 ...........................496
12.15.3 解决方案....................496
12.16 小结 .....................................501
12.17 习题 .....................................501
第 13 章 支持功能 .......................... 503
13.1 预处理 ...................................503
13.1.1 在程序中包含头文件 ....503
13.1.2 定义自己的头文件 ........504
13.1.3 管理多个源文件 ............504
13.1.4 外部变量........................505
13.1.5 静态函数........................505
13.1.6 替换程序源代码 ............506
13.2 宏 ...........................................507
13.2.1 看起来像函数的宏 ........507
13.2.2 字符串作为宏参数 ........50913.2.3 在宏展开式中结合两个
变元 ............................... 510
13.3 多行上的预处理器指令.......510
13.3.1 预处理器逻辑指令 ........511
13.3.2 条件编译 ........................511
13.3.3 测试多个条件 ............... 512
13.3.4 取消定义的标识符 ....... 512
13.3.5 测试标识符的指定值
的指令 ........................... 512
13.3.6 多项选择 ....................... 513
13.3.7 标准预处理宏 ............... 514
13.4 调试方法...............................515
13.4.1 集成的调试器 ............... 515
13.4.2 调试阶段的预处理器 ... 515
13.4.3 断言 ............................... 519
13.5 日期和时间函数...................521
13.5.1 获取时间值 ................... 522
13.5.2 获取日期 ....................... 525
13.5.3 确定某一天是星期几 ... 529
13.6 小结.......................................531
13.7 习题.......................................531
第 14 章 高级专用主题 ...................533
14.1 使用国际字符集...................533
14.1.1 理解 Unicode................. 533
14.1.2 设置区域 ....................... 534
14.1.3 宽字符类型 wchar_t ..... 535
14.1.4 宽字符串的操作 ........... 537
14.1.6 存储 Unicode 字符的
固定大小类型................541
14.2 用于可移植性的专用整数
类型 ......................................545
14.2.1 固定宽度的整型 ............545
14.2.2 最小宽度的整型 ............545
14.2.3 最大宽度的整型 ............546
14.3 复数类型 ...............................546
14.3.1 复数基础........................546
14.3.2 复数类型和操作 ............547
14.4 用线程编程 ...........................550
14.4.1 创建线程........................550
14.4.2 退出线程........................551
14.4.3 把一个线程连接到另一个
线程上............................552
14.4.4 挂起线程........................555
14.4.5 管理线程对数据
的访问............................555
14.5 小结 .......................................561
附录 A 计算机中的数学知识........... 563
附录 B ASCII 字符代码定义 ........... 571
附录 C C 语言中的保留字 .............. 575
附录 D 输入输出格式指定符 .......... 577
附录 E 标准库头文件 ..................... 583