前言
欢迎阅读《学习C 20(中文版)》。本书旨在为软件开发人员介绍前沿的计算机编程语言,遵循的是ISO C 标准委员会在2020年9月通过的C 20标准(英文版有1834页)。
C 编程语言适合用来构建高性能的关键业务和关键任务计算系统,包括操作系统、实时系统、嵌入式系统、游戏系统、银行系统、空中管制系统以及通信系统等。本书的定位是帮助读者掌握C 语言,所以书中涵盖了C 语言本身(世界上最流行的编程语言之一)及其相关的标准库,对C 20进行了友好的、现代的、范例代码丰富的、面向案例的介绍。在这里,我们将探讨这本书的“灵魂”。
着眼于现代C
本书专注于“现代C ”,包含了四个最新的C 标准:C 20、C 17、C 14和C 11,并对C 23以及更新的关键特性进行了展望。本书致力于探讨如何以一些新的和改进的方法用C 进行编码。我们采用的是最佳实践,强调当前专业软件开发的“现代C ”惯例,并将重点放在性能、安全性和软件工程这几个主题上。
保持话题性
“勇于传道授业解惑的人,是绝对不会停止进步的。”(约翰·科顿·达纳)
为了掌握“现代C ”的发展动态并改变开发人员用C 来写代码的方式,我们阅读、浏览或观看了最新的文章、研究论文、白皮书、文档以及博客帖子、论坛帖子和视频,数量累计超过6 000。
C 版本
作为开发人员,你可能要按项目要求解决C 遗留代码或使用特定的C 版本。为此,本书中提到了“C 20”这样的提示,以便每次提到某个“现代C ”语言特性时,你就知道它首次出现于C 哪个版本中。这些内容有助于你体会C 的发展历程:通常都是从低级别的细节,逐渐发展到更容易使用的高级别的表达形式。这个趋势有利于缩短开发时间、改善性能、提高安全性和系统可维护性。
目标读者
本书面向以下四类读者。
希望能够有一本内容全面、专业精深的教程可以帮助自己学习最新C 20特性的C 软件开发人员。
需要做C 项目并想学习最新语言特性的非C 软件开发人员。
在大学里学过C 或者在一段时间内因为职业需要用过C 并希望在C 20的背景下更新C 知识的软件开发人员。
计划开发C 20课程的C 职业培训师。
“实时编码”方法和代码下载
本书的核心内容是我们Deitel标志性的实时编码(Live-Code)方法。我们不展示代码片段,而是在数百个完整的、可运行的、具有实时输出的真实C 程序的背景下使用C 。
请阅读“前言”之后的“准备工作”部分,从中了解如何设置Windows、macOS或Linux计算机,以便运行大约由15 000行代码组成的200多个代码示例。所有源代码都可以在以下网站免费下载:
https://github.com/pdeitel/CPlusPlus20ForProgrammers
https://www.deitel.com/books/c-plus-plus-20-for-programmers
https://informit.com/title/9780136905691
为了提供方便,我们以C 源代码(后缀名为.cpp和.h)文件的形式提供本书的例子,供集成开发环境和命令行编译器使用。参见第1章的“试运行”一节(第1.2节),了解如何用我们推荐的三种编译器来编译和运行代码示例。在看书的同时执行每个程序,会有鲜活的学习体验。遇到任何问题,都可以通过deitel@deitel.com联系
我们。
三种工业强度的编译器
我们在以下最新版本的平台上测试了所有代码示例。
Windows?平台:Microsoft? Visual Studio?社区版的Visual C ?。
macOS?平台:Apple? Xcode?以及一个Docker?容器中的Clang C (clang )。
Linux?平台:GNU编译器集合(GCC)Docker?容器中的GNU? C (g )。
写作本书的时候,大多数C 20特性已经由所有三个编译器完全实现,有些由三个编译器中的一个子集实现,有些还没有由任何编译器实现。我们会酌情指出这些差异并在编译器厂商实现剩余的C 20特性时更新我们的数字版的内容。我们还会在本书的GitHub仓库中发布代码更新:
https://github.com/pdeitel/CPlusPlus20ForProgrammers
本书配套网站同时提供对代码和正文的更新:
https://www.deitel.com/books/c-plus-plus-20-for-programmers
https://informit.com/title/9780136905691
本书中文版网站会提供中文版后期勘误:
https://bookzhou.com
编程技巧和C 20关键特性
本书使用多种图标来提醒读者留意软件开发技巧及C 20的模块和概念特征。
这类图标着重强调为正确开发软件而需要注意的架构和设计问题,特别是对于较大型的系统。
这样的最佳实践帮助大家加强程序安全以抵御攻击。
这一类提示给出了使你的程序运行得更快或尽量减少占用内存的窍门。
常见编程错误有助于减少犯同样错误的可能性。
C 核心准则建议(后面有具体说明)。
C 20新的模块特性。
C 20新的概念特性。
“对象自然”方法
第9章开始介绍如何开发自定义的C 20类并在后续章节继续讨论面向对象编程。
1. 何为对象自然
在第9章之前的各章,使用的是一些现有的类,它们能完成很多重要的工作。我们快速创建这些类的对象,并通过数量最少的简单C 语句让它们“大显身手”。这就是我们所称的“对象自然方法”(Objects-Natural Approach)。
C 社区已经创建了大量免费、开源的类库,所以在第9章学习如何创建自己的C 类之前,大多数读者就已经能够执行强大的任务了。这是使用面向对象语言(特别是C 这样成熟的面向对象语言)最吸引人的地方。
2. 免费的类
我们鼓励使用C 生态系统中现有的类,数量大且有价值、免费,它们通常有以下来源:
C 标准库
平台特有的库,如微软的Windows、苹果的macOS或各种Linux版本所提供的库
免费的第三方C 库,通常由开源社区创建
其他开发者,比如你所在组织的开发者
我们鼓励大家查看大量免费的、开源的C 代码实例(可在GitHub等网站上找到),从中找找灵感。
3. Boost项目
Boost提供了168个开源的C 库。它也是最终被纳入C 标准库之新特性的“温床”。一些已被添加到“现代C ”的特性包括多线程、随机数生成、智能指针、元组、正则表达式、文件系统和string_view。以下StackOverflow答案列出了从Boost库演变而来的“现代C ”库和语言特性:
https://stackoverflow.com/a/8852421
4. 对象自然案例学习
第1章主要学习解释对象技术的基本概念和术语。然后,到第9章之前,本书的重点都是创建并使用现有类的对象。在第9章及之后的各章,才会开始创建自定义类。我们的对象自然案例学习如下:
2.7节——创建并使用标准库string类的对象
3.12节——任意大小的整数
4.13节——使用miniz-cpp库读写ZIP文件
5.20节——Lnfylun Lhqtomh Wjtz Qarcv: Qjwazkrplm xzz Xndmwwqhlz(这是我们私钥加密案例学习的加密标题)
6.15节——C 标准库模板类vector
7.10节——C 20 span:连续容器元素的视图
8.19节——读取/分析包含泰坦尼克号灾难数据的CSV文件
8.20节——正则表达式简介
9.22节——用JSON序列化对象
对于对象自然,一个完美的例子是直接使用现有类的对象,如array和vector(第6章),而不需要知道如何编写自定义类,特别是不需要知道如何编写这些类。本书会广泛使用现有C 标准库的功能。
本书导读
全书各章内容如下所示。
这里描述了本书的许多关键特性。前几章为C 20的学习打下坚实的基础。后续涉及中高主题的章节和案例学习可以帮助大家轻松进入基于C 20的现代软件开发。贯穿全书,我们将讨论C 20的几种编程模型:
程序化编程
函数式编程
面向对象编程
泛型编程
模板元编程
第Ⅰ部分:编程基础
第1章:本书是为专业软件开发人员编写的,所以首先提供一个简单的介绍。其
次,讨论摩尔定律、多核处理器以及为什么标准化的并发编程在现代C 语言中很重要。最后,对面向对象做一个简单的回顾,介绍贯穿全书的术语。
接下来,直接进入试运行环节,演示如何用我们首选的三个免费编译器编译和执行C 代码:Windows平台是作为Visual Studio一部分提供的Microsoft Visual C ;macOS 平台是Apple Xcode;Linux平台是GNU g 。
我们使用每一种环境对书中的代码实例进行了测试,指出了少数编译器不支持某一特定语言特性的情况。请选择自己喜欢的程序开发环境。本书在其他C 20编译器中也能很好地工作。
我们还演示了GNU编译器集合(GCC) Docker容器中的GNU g 以及一个Docker容器中的Clang C 。这样一来,就可以在Windows、macOS或Linux上运行最新的GNU g 和clang 命令行编译器。关于Docker这种重要的开发工具的更多信息,请参见前面的介绍。要了解安装说明,请阅读“前言”之后的“准备工作”。
Windows用户也可以直接安装Linux,我们会指导你阅读微软提供的指示,通过Windows Subsystem for Linux(WSL)在Windows上安装Linux。这是在Windows上使用g 和clang 编译器的另一种方式。
第2章介绍C 的基础知识,说明关键的语言特性,包括输入、输出、基本数据类型、算术操作符及其优先级以及决策。2.7节的对象自然案例学习演示了如何创建并使用标准库提供的string类的对象。在这个时候,不必知道如何开发自定义类,特别是不必知道如何实现如此大型且复杂的类。
第3章的重点是控制语句。将开始学习if和if...else选择语句,用计数器控制和用哨兵控制的while循环语句,以及递增、递减和赋值操作符。3.12节的对象自然案例学习演示了如何使用第三方库来创建任意大小的整数。
第4章介绍C 的其他控制语句,包括for,do...while,switch,break和continue,还介绍了逻辑操作符。4.13节的对象自然案例学习演示了如何使用miniz-cpp库以编程方式写入和读取ZIP文件。
第5章介绍自定义函数。我们用随机数生成来演示模拟技术。C 从C语言继承的随机数生成函数rand不具备良好的统计特征,是可以预测的。我们讲解了C 11引入的更安全的随机数库,它能生成非确定性的随机数——一组无法预测的随机数。这种随机数生成器应用于那些不容许预测的模拟和安全场景。我们还讨论了函数之间的信息传递以及递归。5.20节的对象自然案例学习演示了私钥加密。
第Ⅱ部分:数组、指针和字符串
第6章初步讨论C 标准库的容器、迭代器和算法。我们介绍了C 标准库中用于表示值的列表和表格的array容器。将定义和初始化数组,并访问其元素。讨论了如何将数组传给函数,对数组进行排序和查找,以及操作多维数组。我们通过介绍lambda表达式(匿名函数)和C 20的“范围”——C 20的“四大”特性之一——来开始接触函数式编程。6.15节的对象自然案例学习演示了C 标准库的vector模板。本章实质是array和vector的一个大型的“对象自然”案例学习,其中的代码很好地演示了“现代C ”编码惯例(coding idiom)。
第7章全面介绍指针,并探讨内置指针、基于指针的数组和基于指针的字符串(也称为C字符串)之间的密切关系,所有这些都是C 从C语言继承的。指针很强大,但使用起来很有挑战性。为此,“现代C ”设计了一些特性来消除对大多数指针的需求,使代码变得更健壮、更安全。这些特性包括array和vector、C 20 span以及C 17 string_view。我们还是会讨论内置数组,它们在C 中依然有用,也是你看懂遗留代码所需要的。不过,如果是开发新项目,那么应该首选“现代C ”提供的能力。7.10节的对象自然案例学习展示的就是这样的一种能力:C 20 span。它使你能查看和操作连续容器(例如基于指针的数组以及标准库的array和vector)的元素,同时无须直接使用指针。本章再次强调了“现代C ”的编码
惯例。
第8章介绍标准库string类的许多特性,展示如何读写纯文本文件和以逗号分隔的CSV文件(常用于表示数据集),讨论如何用标准库的正则表达式(regex)功能进行字符串模式匹配。C 支持两种类型的字符串:string对象和C风格的、基于指针的字符串。我们使用string类的对象使程序变得更健壮,同时避免C字符串的许多安全问题。如果要开发新项目,那么应该首选string对象。我们还介绍了C 17的string_view,它是将任何类型的字符串传递给函数的一种轻量级的、灵活的机制。本章有两个对象自然案例学习。
8.19节通过读取并分析一个包含泰坦尼克号灾难数据集的CSV文件来介绍数据分析,这是向初学者介绍数据分析的一个流行的数据集。
8.20节介绍了正则表达式模式匹配和文本替换。
第Ⅲ部分:面向对象程序设计
第9章正式讨论面向对象编程,我们会编写一些有价值的自定义类。C 是一种可扩展的语言——你编写的每个类都会成为一个新类型,可基于它创建对象。9.22节的对象自然案例学习使用第三方库cereal将对象转换为JSON格式(序列化),并从其JSON表示中重新创建这些对象(反序列化)。
第10章主要讨论继承层次结构中类之间的关系以及这些关系所带来的强大的运行时多态处理能力。本章的一个重要方面是了解多态性是如何工作的。我们用插图和文字详细解释了C 于幕后如何实现多态性、虚函数和动态绑定。你会看到,语言使用了一种优雅的、基于指针的数据结构。我们还介绍了用于实现运行时多态性的其他机制,其中包括非虚接口(NVI)惯用法和std::variant/std::visit。本章还讨论了一个重要的编程原则:藉由接口来编程,而不要藉由实现(programming to an interface,not an implementation)。
第11章介绍如何使C 现有的操作符与自定义类的对象一起工作,并讨论了智能指针和动态内存管理。智能指针提供了内置指针所不具备的额外功能,能帮助大家避免动态内存管理错误。unique_ptr会在本章讨论,而shared_ptr和weak_ptr会在本书在线内容的第20章讨论。本章的一个关键点是教大家打造有价值的类。首先展示一个string类的例子,它优雅地运用了操作符重载技术。然后,教大家如何创建自定义类来实现该功能。接着是本书最重要的案例学习之一,你将利用重载操作符和其他功能创建自定义的MyArray类,从而解决C 原生的、基于指针的数组所存在的各种问题。我们介绍并实现了5种可在所有类中定义的特殊成员函数:拷贝构造函数、拷贝赋值操作符、移动构造函数、移动赋值操作符和析构函数。我们讨论了拷贝语义和移动语义,它们使编译器能够将资源从一个对象移动到另一个对象,以避免昂贵的、不必要的拷贝。我们介绍了C 20的三路比较操作符<=>(也称为“太空飞船操作符”),并演示了如何实现自定义转换操作符。第15章会着手将MyArray转换为一个可用于存储指定类型的元素的类模板,届时将真正打造出一个有价值的类。
第12章继续讨论第6章开始引入的异常处理。我们讨论了何时使用异常、异常安全保证、构造函数/析构函数中的异常、如何处理动态内存分配失败以及为什么有的项目不使用异常处理。本章最后还介绍了契约,这是未来C 可能会纳入的一个特性。我们通过godbolt.org网站上的一个实验性契约实现来进行说明。契约的一个目标是将大多数函数都变成noexcept,即指定函数不抛出异常。这可能允许编译器执行额外的优化,同时消除异常处理的开销和复杂性。
导语摘要
《学习C 20(中文版)》共18章5个附录,讨论了C 20的5大编程模型:程序化编程、函数式编程、面向对象编程、泛型编程和模板元编程。第I部分介绍基础知识,第II部分介绍容器、C 20范围、指针、字符串和文件,第III部分介绍现代面向对象编程和异常,第Ⅳ部分介绍泛型编程、模板、概念和模板元编程,第V部分介绍高级主题,包括模块、并行算法、并发和协程。 《学习C 20(中文版)》适合需要了解C 20新特性的程序员,包括零基础或有经验的C 程序员以及其他想要了解C 的程序员,也适合希望开课教C 20的老师。
作者简介
保罗·J.戴特尔(Paul J. Deitel)毕业于麻省理工学院(MIT),有42年计算机行业的工作经验。他是全球知名的编程语言培训师之一,自1992年以来一直在为软件开发人员讲授专业课程。他与哈维·M.戴特尔(Harvey M. Deitel)博士共同编写了全球最畅销的编程教材、专业书籍、视频和互动多媒体电子学习内容。
目录
第Ⅰ部分 编程基础
第1章 免费、流行的C 编译器 003
第2章 C 编程入门 025
第3章 控制语句(上) 045
第4章 控制语句(下) 077
第5章 函数和函数模板入门 113
第Ⅱ部分 数组、指针和字符串
第6章 数组、向量、范围和函数式编程 171
第7章 现代C 对指针的淡化 211
第8章 string、string_view、文本文件、CSV文件和正则表达式 247
第Ⅲ部分 面向对象程序设计
第9章 自定义类 303
第10章 OOP:继承和运行时多态性 379
第11章 操作符重载、拷贝/移动语义和智能指针 467
第12章 异常和对契约的展望 527
第Ⅳ部分 标准库容器、迭代器和算法
第13章 标准库容器和迭代器 571
第14章 标准库算法和C 20范围/视图 625
第Ⅴ部分 高级编程主题
第15章 模板、C 20“概念”和元编程 703
第16章 C 20模块:大规模开发 797
第17章 并行算法和并发性:高级观点 851
第18章 C 20协程 994
附录A 操作符优先级和分组 969
附录B 字符集 971
详细目录
第Ⅰ部分 编程基础
第1章 免费、流行的C 编译器
1.1 导读 004
1.2 试运行一个C 20应用程序 005
1.2.1 在Windows上用VS 2022社区版编译和运行C 20应用程序 005
1.2.2 在macOS上用Xcode编译和运行C 20应用程序 009
1.2.3 在Linux上用GNU C 运行C 20应用程序 013
1.2.4 在GCC Docker容器中编译和运行C 20应用程序 015
1.2.5 在Docker容器中使用clang 来编译和运行C 20应用程序 016
1.3 摩尔定律、多核处理器和并发编程 018
1.4 面向对象简单回顾 019
1.5 小结 021
第2章 C 编程入门
2.1 导读 026
2.2 第一个C 程序:显示单行文本 026
2.3 修改第一个C 程序 030
2.4 另一个C 程序:整数相加 031
2.5 算术运算 035
2.6 决策:相等性和关系操作符 036
2.7 对象自然案例学习:创建和使用标准库类string的对象 040
2.8 小结 044
第3章 控制语句(上)
3.1 导读
以下为对购买帮助不大的评价