新書推薦:
《
惜华年(全两册)
》
售價:HK$
70.3
《
甲骨文丛书·古代中国的军事文化
》
售價:HK$
99.7
《
中国王朝内争实录(套装全4册):从未见过的王朝内争编著史
》
售價:HK$
244.2
《
半导体纳米器件:物理、技术和应用
》
售價:HK$
177.0
《
创客精选项目设计与制作 第2版 刘笑笑 颜志勇 严国陶
》
售價:HK$
61.6
《
佛山华家班粤菜传承 华家班59位大厨 102道粤菜 图文并茂 菜式制作视频 粤菜故事技法 佛山传统文化 广东科技
》
售價:HK$
221.8
《
武人琴音(十周年纪念版 逝去的武林系列收官之作 形意拳一门三代:尚云祥、韩伯言、韩瑜的人生故事 凸显百年武人命运)
》
售價:HK$
43.7
《
剑桥斯堪的纳维亚戏剧史(剑桥世界戏剧史译丛)
》
售價:HK$
154.6
編輯推薦:
《C 17入门经典第5版》特色
? 定义变量和做出决策
? 使用数组和循环、指针和引用、字符串等
? 编写自己的函数、类型和运算符
? 了解面向对象编程的关键概念
? 使用重载、继承、虚函数和多态性
? 编写泛型函数模板和类模板
? 了解现代C的特性:自动类型推断、移动语义、lambda表达式等
? 探索C17的新增特性
內容簡介:
《C 17入门经典第5版》介绍如何使用*的C17编写程序。从基础知识讲起,通过详细分析示例,帮助读者成为能够自己编写程序的C程序员。参考《C 17入门经典第5版》的内容,并安装*的C编译器,读者很快就能编写真正的C程序。《C 17入门经典第5版》不需要读者有任何编程经验,因此在讲解所有语言概念时,均给出了可以工作的程序示例,并且全部章节都包含练习题,以帮助读者检测并练习自己学到的知识。《C 17入门经典第5版》为正文中的所有代码示例和练习题提供可下载的代码。 《C 17入门经典第5版》内容已针对C语言的*版本C17做了全面更新,并且介绍了现代C的约定和*实践。《C 17入门经典第5版》还介绍了C标准库的元素,它们为C17语言提供了必要的支持。
關於作者:
Ivor Horton从数学系毕业,却被信息技术领域工作量少、回报高的前景所吸引。虽然现实证明,工作量大,回报相对一般,但是他与计算机一直相伴到今天。在不同的时期,他参与过编程、系统设计、咨询以及相当复杂的项目的管理和实施工作。
Ivor有多年工程设计和制造控制系统的设计和实施经验。他使用多种编程语言开发过在不同场景中很实用的应用程序,并教会一些科学家和工程师如何使用编程语言开发一些实用的程序。他目前出版的图书涉及C、C和Java等编程语言。当他没有在撰写编程图书或者为他人提供咨询服务时,他会去钓鱼或旅行,享受生活。
Peter Van Weert是一名软件工程师,主要兴趣和专长是应用软件开发、编程语言、算法和数据结构。他在鲁汶大学以最优毕业生荣誉获得计算机科学硕士学位,并得到了考试委员会的祝贺。2010年,他在鲁汶大学的声明式编程语言和人工智能研究组完成了博士论文,主题是基于规则的编程语言的设计和高效编译。在攻读博士期间,他担任面向对象编程Java、软件分析与设计以及声明式编程的助教。Ivor Horton从数学系毕业,却被信息技术领域工作量少、回报高的前景所吸引。虽然现实证明,工作量大,回报相对一般,但是他与计算机一直相伴到今天。在不同的时期,他参与过编程、系统设计、咨询以及相当复杂的项目的管理和实施工作。
Ivor有多年工程设计和制造控制系统的设计和实施经验。他使用多种编程语言开发过在不同场景中很实用的应用程序,并教会一些科学家和工程师如何使用编程语言开发一些实用的程序。他目前出版的图书涉及C、C和Java等编程语言。当他没有在撰写编程图书或者为他人提供咨询服务时,他会去钓鱼或旅行,享受生活。
Peter Van Weert是一名软件工程师,主要兴趣和专长是应用软件开发、编程语言、算法和数据结构。他在鲁汶大学以最优毕业生荣誉获得计算机科学硕士学位,并得到了考试委员会的祝贺。2010年,他在鲁汶大学的声明式编程语言和人工智能研究组完成了博士论文,主题是基于规则的编程语言的设计和高效编译。在攻读博士期间,他担任面向对象编程Java、软件分析与设计以及声明式编程的助教。
毕业后,Peter在Nikon Metrology工作了6年多,负责3D激光扫描和点云检查领域的大规模工业应用软件设计。他学习并精通C以及极大规模代码库的重构和调试,并进一步熟悉了软件开发过程的各个方面,包括功能和技术需求的分析,以及敏捷的、基于Scrum的项目和团队管理。
如今,Peter就职于Danaher的数字牙医软件研发部,为未来的牙医业开发软件。
在空余时间,他与人合作撰写了两本关于C的图书,开发了两个获奖的Windows 8应用,并且是比利时C用户组的定期专家演讲人和董事会成员。
目錄 :
目 录
第1章 基本概念 1
1.1 现代C 1
1.2 标准库 2
1.3 C程序概念 2
1.3.1 源文件和头文件 3
1.3.2 注释和空白 3
1.3.3 预处理指令和标准库头文件 3
1.3.4 函数 3
1.3.5 语句 4
1.3.6 数据的输入输出 4
1.3.7 return语句 5
1.3.8 名称空间 5
1.3.9 名称和关键字 6
1.4 类和对象 6
1.5 模板 6
1.6 代码的表示样式和编程风格 7
1.7 创建可执行文件 7
1.8 过程化编程和面向对象编程 8
1.9 表示数字 9
1.9.1 二进制数 9
1.9.2 十六进制数 10
1.9.3 负的二进制数 11
1.9.4 八进制数 12
1.9.5 Big-Endian和Little-Endian系统 12
1.9.6 浮点数 13
1.10 表示字符 14
1.10.1 ASCII 码 14
1.10.2 UCS和Unicode 14
1.11 C源字符 15
1.12 本章小结 17
1.13 练习 17
第2章 基本数据类型 19
2.1 变量、数据和数据类型 19
2.1.1 定义整型变量 19
2.1.2 零初始化 22
2.1.3 定义有固定值的变量 22
2.2 整型字面量 22
2.2.1 十进制整型字面量 23
2.2.2 十六进制的整型字面量 23
2.2.3 八进制的整型字面量 24
2.2.4 二进制的整型字面量 24
2.3 整数的计算 24
2.4 赋值运算 26
2.5 sizeof运算符 29
2.6 整数的递增和递减 30
2.7 定义浮点变量 31
2.8 浮点字面量 32
2.9 浮点数的计算 32
2.9.1 缺点 32
2.9.2 无效的浮点结果 33
2.9.3 数学函数 33
2.10 输出流的格式化 35
2.11 混合的表达式和类型转换 37
2.12 显式类型转换 38
2.13 确定数值的上下限 40
2.14 使用字符变量 41
2.15 auto关键字 42
2.16 本章小结 43
2.17 练习 43
第3章 处理基本数据类型 45
3.1 运算符的优先级和相关性 45
3.2 位运算符 46
3.2.1 移位运算符 47
3.2.2 位模式下的逻辑运算 49
3.3 枚举数据类型 53
3.4 数据类型的别名 55
3.5 变量的生存期 56
3.6 全局变量 56
3.7 本章小结 59
3.8 练习 59
第4章 决策 61
4.1 比较数据值 61
4.1.1 应用比较运算符 62
4.1.2 比较浮点数值 63
4.2 if语句 63
4.2.1 嵌套的if语句 65
4.2.2 字符分类和转换 66
4.3 if-else语句 68
4.3.1 嵌套的if-else语句 69
4.3.2 理解嵌套的if语句 70
4.4 逻辑运算符 71
4.4.1 逻辑与运算符 71
4.4.2 逻辑或运算符 71
4.4.3 逻辑非运算符 72
4.4.4 组合逻辑运算符 72
4.4.5 对整数操作数应用逻辑运算符 73
4.4.6 对比逻辑运算符与位运算符 74
4.5 条件运算符 75
4.6 switch语句 76
4.7 语句块和变量作用域 81
4.8 本章小结 82
4.9 练习 83
第5章 数组和循环 85
5.1 数组 85
5.2 理解循环 87
5.3 for循环 87
5.4 避免幻数 89
5.5 用初始化列表定义数组的大小 90
5.6 确定数组的大小 90
5.7 用浮点数控制for循环 91
5.8 使用更复杂的for循环控制表达式 93
5.9 基于范围的for循环 94
5.10 while循环 95
5.11 do-while循环 96
5.12 嵌套的循环 98
5.13 跳过循环迭代 100
5.14 循环的中断 101
5.15 使用无符号整数控制for循环 103
5.16 字符数组 104
5.17 多维数组 107
5.17.1 初始化多维数组 108
5.17.2 多维字符数组 110
5.18 在运行期间给数组分配内存空间 111
5.19 数组的替代品 112
5.19.1 使用array容器 113
5.19.2 使用std::vector容器 116
5.20 本章小结 119
5.21 练习 120
第6章 指针和引用 121
6.1 什么是指针 121
6.2 地址运算符 123
6.3 间接运算符 124
6.4 为什么使用指针 125
6.5 char类型的指针 125
6.6 常量指针和指向常量的指针 128
6.7 指针和数组 130
6.7.1 指针的算术运算 130
6.7.2 使用数组名的指针表示法 132
6.8 动态内存分配 133
6.8.1 栈和自由存储区 134
6.8.2 运算符new和delete 134
6.8.3 数组的动态内存分配 135
6.9 通过指针选择成员 138
6.10 动态内存分配的危险 138
6.10.1 悬挂指针和多次释放 138
6.10.2 分配与释放的不匹配 139
6.10.3 内存泄漏 139
6.10.4 自由存储区的碎片 139
6.11 内存分配的黄金准则 140
6.12 原始指针和智能指针 140
6.12.1 使用unique_ptr指针 141
6.12.2 使用shared_ptr指针 143
6.13 理解引用 146
6.13.1 定义引用 146
6.13.2 在基于范围的for循环中使用引用变量 147
6.14 本章小结 148
6.15 练习 148
第7章 操作字符串 151
7.1 更强大的string类 151
7.1.1 定义string对象 151
7.1.2 string对象的操作 154
7.1.3 访问字符串中的字符 157
7.1.4 访问子字符串 158
7.1.5 比较字符串 158
7.1.6 搜索字符串 162
7.1.7 修改字符串 167
7.1.8 对比std::string与std::vector 170
7.2 将字符串转换为数字 171
7.3 字符串流 171
7.4 国际字符串 172
7.4.1 存储wchar_t字符的字符串 172
7.4.2 包含Unicode字符串的对象 173
7.5 原始字符串字面量 173
7.6 本章小结 174
7.7 练习 175
第8章 定义函数 177
8.1 程序的分解 177
8.1.1 类中的函数 177
8.1.2 函数的特征 178
8.2 定义函数 178
8.2.1 函数体 179
8.2.2 返回值 180
8.2.3 函数声明 181
8.3 给函数传送实参 182
8.3.1 按值传送 182
8.3.2 按引用传送 187
8.3.3 字符串视图:新的const string引用 192
8.4 默认实参值 194
8.5 main函数的实参 196
8.6 从函数中返回值 196
8.6.1 返回指针 197
8.6.2 返回引用 199
8.6.3 对比返回值与输出参数 200
8.6.4 返回类型推断 200
8.6.5 使用可选值 201
8.7 静态变量 203
8.8 内联函数 204
8.9 函数重载 204
8.9.1 重载和指针参数 206
8.9.2 重载和引用参数 206
8.9.3 重载和const参数 207
8.9.4 重载和默认实参值 208
8.10 递归 209
8.10.1 基本示例 209
8.10.2 递归算法 210
8.11 本章小结 215
8.12 练习 216
第9章 函数模板 219
9.1 函数模板 219
9.2 创建函数模板的实例 220
9.3 模板类型参数 221
9.4 显式指定模板实参 221
9.5 函数模板的特例 222
9.6 函数模板和重载 222
9.7 带有多个参数的函数模板 224
9.8 模板的返回类型推断 225
9.8.1 decltype和拖尾返回类型 225
9.8.2 对比decltypeauto、拖尾decltype与auto 226
9.9 模板参数的默认值 226
9.10 非类型的模板参数 227
9.11 本章小结 229
9.12 练习 229
第10章 程序文件和预处理指令 231
10.1 理解转换单元 231
10.1.1 单一定义规则 231
10.1.2 程序文件和链接 232
10.1.3 确定名称的链接属性 232
10.1.4 外部函数 233
10.1.5 外部变量 233
10.1.6 内部名称 235
10.2 预处理源代码 236
10.3 定义预处理宏 236
10.3.1 定义类似于函数的宏 238
10.3.2 取消宏的定义 239
10.4 包含头文件 240
10.4.1 防止重复头文件的内容 240
10.4.2 第一个头文件 241
10.5 名称空间 242
10.5.1 全局名称空间 242
10.5.2 定义名称空间 242
10.5.3 应用using声明 244
10.5.4 函数和名称空间 244
10.5.5 未命名的名称空间 246
10.5.6 嵌套的名称空间 247
10.5.7 名称空间的别名 248
10.6 逻辑预处理指令 248
10.6.1 逻辑#if指令 248
10.6.2 测试指定标识符的值 249
10.6.3 多个代码选择 249
10.6.4 标准的预处理宏 250
10.6.5 检查头文件是否可用 251
10.7 调试方法 251
10.7.1 集成调试器 252
10.7.2 调试中的预处理指令 252
10.7.3 使用assert宏 254
10.8 静态断言 255
10.9 本章小结 257
10.10 练习 257
第11章 定义自己的数据类型 259
11.1 类和面向对象编程 259
11.1.1 封装 260
11.1.2 继承 262
11.1.3 多态性 263
11.2 术语 263
11.3 定义类 264
11.4 构造函数 265
11.4.1 默认构造函数 265
11.4.2 定义类的构造函数 266
11.4.3 使用default关键字 267
11.4.4 在类的外部定义函数和构造函数 267
11.4.5 默认构造函数的参数值 268
11.4.6 使用成员初始化列表 269
11.4.7 使用explicit关键字 269
11.4.8 委托构造函数 271
11.4.9 副本构造函数 272
11.5 访问私有类成员 273
11.6 this指针 274
11.7 const对象和const成员函数 275
11.7.1 const成员函数 276
11.7.2 const正确性 277
11.7.3 重载const 277
11.7.4 常量的强制转换 279
11.7.5 使用mutable关键字 279
11.8 友元 280
11.8.1 类的友元函数 280
11.8.2 友元类 281
11.9 类的对象数组 282
11.10 类对象的大小 283
11.11 类的静态成员 283
11.11.1 静态成员变量 283
11.11.2 访问静态成员变量 286
11.11.3 静态常量 286
11.11.4 类类型的静态成员变量 287
11.11.5 静态成员函数 288
11.12 析构函数 288
11.13 使用指针作为类成员 290
11.14 嵌套类 299
11.15 本章小结 302
11.16 练习 303
第12章 运算符重载 305
12.1 为类实现运算符 305
12.1.1 运算符重载 305
12.1.2 实现重载运算符 306
12.1.3 非成员运算符函数 307
12.1.4 提供对运算符的全部支持 308
12.1.5 在类中实现所有的比较运算符 309
12.2 可以重载的运算符 311
12.3 运算符函数习语 313
12.4 为输出流重载模板 481
18.5 本章小结 482
18.6 练习 483
第19章 容器与算法 485
19.1 容器 485
19.1.1 顺序容器 485
19.1.2 栈和队列 488
19.1.3 集合 489
19.1.4 映射 491
19.2 迭代器 494
19.2.1 迭代器设计模式 495
19.2.2 标准库容器的迭代器 496
19.2.3 数组的迭代器 502
19.3 算法 503
19.3.1 第一个示例 503
19.3.2 寻找元素 504
19.3.3 输出多个值 505
19.3.4 删除-擦除技术 507
19.3.5 排序 507
19.3.6 并行算法 508
19.4 本章小结 508
19.5 练习 509
內容試閱 :
前 言
欢迎阅读《C17入门经典(第5版)》。《C17入门经典(第5版)》是Ivor Horton撰写的Beginning ANSI C的修订更新版本。自从那《C17入门经典(第5版)》出版以后,C语言已经被大量扩展和改进,使得如今已经无法在一《C17入门经典(第5版)》中详细解释完整的C语言。《C17入门经典(第5版)》将介绍C语言和标准库特性的基本知识,足以让读者开始编写自己的C程序。学习完《C17入门经典(第5版)》后,读者将有能力扩展自己的C技能的深度和广度。
我们假定读者没有任何编程经验。如果读者乐于学习,并且擅长逻辑思维,那么理解C并没有想象中那么难。通过开发C技能,读者将学习一种已经有数千万人使用的编程语言,而且这种语言能够用来在几乎任何环境中开发应用程序。
C非常强大,甚至可以说,它比大部分编程语言更加强大。所以,就像任何强大的工具一样,如果不经训练就开始使用,可能造成严重伤害。我们常把C比作瑞士军刀:由来已久,大众信任,极为灵活,但也可能令人茫然,并且到处是尖锐的东西,可能伤害自己。但是,当有人明明白白解释不同工具的用途,并讲解一些基本的用刀安全守则之后,就再也不需要寻找其他小型刀具了。
学习C并不像想象中的那样具有很大危险或困难。如今的C要比许多人想象中的更容易理解。自从40年前C语言问世之后,已经有了长足的改进。本质上,我们已经学会了如何以最安全有效的方式来使用其强大的刀刃和工具。而且,可能更重要的是,C语言及其标准库也相应地发生了演化,更便于使用。特别是,过去十年间,现代C开始崛起。现代C强调使用更新、更具表达力、更安全的语言特性,并结合经过实践验证的最佳实践和编码指导原则。当知道并应用一些简单的规则和技术后,C的许多复杂性将随之消失。关键在于有人能够不只恰当地、循序渐进地解释C能做什么,还能解释应该怎么使用C去做。这正是《C17入门经典(第5版)》的目的。
在这本最新修订版中,我们不遗余力,使内容跟上C编程的这个新时代。当然,与以前的版本一样,我们仍然采用轻松的、循序渐进的方式进行讲解。我们使用许多实用的编码示例和练习题,展示C旧有的和新增的所有刀刃。还不只如此:我们更加努力地确保总是解释实现某种目的的最适合工具,为什么如此选择,以及如何避免造成失误。我们确保读者从一开始学习C,就采用安全高效的现代编程风格,而这会是未来的雇主们希望员工具备的技能。
《C17入门经典(第5版)》讲解的C语言对应于最新的国际标准化组织International Organization for Standardization,ISO标准,常被称为C17。但是,我们并没有介绍C17的全部内容,因为相比C语言的之前版本,C17所做的许多扩展针对的是高级应用。《C17入门经典(第5版)》的所有示例均可使用支持C17的编译器编译执行。
如何使用《C17入门经典(第5版)》
要通过《C17入门经典(第5版)》学习C,需要有一个支持C17标准的编译器和一个适合编写程序代码的文本编辑器。目前有一些编译器支持C17,其中有几个是免费的。
GCC和Clang编译器对C17提供了全面支持,并且二者都是开源的,可免费下载。对于新手,安装这两个编译器,并将其与合适的编辑器关联起来,并不容易。安装GCC和合适的编辑器,有一种简单的方法,即下载Code::Blocks或Qt Creator。它们都是免费的集成开发环境Integrated Development Environment,IDE,可用于Linux、Apple macOS和Microsoft Windows。它们支持使用几种编译器进行完整的程序开发,其中包括GCC和Clang。这意味着安装了它们可同时得到对C和C的支持。
另一种选择是使用Microsoft Visual C,它运行在Microsoft Windows上。Microsoft Visual C几乎完全支持C17;《C17入门经典(第5版)》的所有示例应该能够在最新版本的Microsoft Visual C上正确编译。其Community版本和Express版本可供个人甚至小规模专业团队免费使用。Visual Studio提供了一个功能全面的专业编辑器,以及对其他语言如C#和Basic的支持。
还有其他一些编译器也支持C17,在网上进行搜索可了解它们。《C17入门经典(第5版)》提供的下载文件中还包含一个清单,其中列出了其他一些可帮助入门的有用资源读者可通过扫描封底二维码来下载《C17入门经典(第5版)》源代码。
《C17入门经典(第5版)》内容应当按顺序阅读,所以读者应该从头读起,直到读完《C17入门经典(第5版)》。但是,只通过读书是无法学会编程的。只有实际编写代码,才能学会如何用C编写程序,所以一定要自己键入所有示例,而不要简单地从下载文件中复制代码,然后编译并执行自己键入的代码。这项工作有时候看起来会很枯燥,但是读者会惊奇地发现,仅仅键入C语句就能够对理解C有巨大帮助,尤其是感觉难以理解某些思想的时候更是如此。如果某个示例不能工作,先不要急于翻看《C17入门经典(第5版)》来查找原因。试着从代码中分析什么地方出错。这是一种很好的练习,因为在实际开发C应用程序时,更多的时候需要自己分析代码。
犯错是学习过程中不可缺少的一部分,书中的练习题给了读者大量机会来犯错。自己设计一些练习题是一个好主意。如果不确定怎么解决一个问题,先自己试一试,然后查看答案。犯错越多,对什么地方会出错的理解就越深刻。确保完成所有练习题,并且要记住,只有确定自己解决不了问题时才查看答案。大部分练习题只需要直接运用对应章节中的知识,换言之,它们只是练习而已,但是也有一些练习题需要深入思考,甚至需要一些灵感。
我们希望读者能够掌握C,并且最重要的是,享受使用C编写程序的过程。
Ivor Horton
Peter Van Weert