首页>参考读物>计算机科学与技术>软件与程序设计

现代C:概念剖析和编程实践
作者 : [德]延斯·古斯泰特(Jens Gustedt) 著
译者 : 刘红泉 译
丛书名 : 华章程序员书库
出版日期 : 2021-05-19
ISBN : 978-7-111-68196-0
定价 : 119.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 348
开本 : 16
原书名 : Modern C
原出版社: Manning Publications
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

这本书按级别组织,编号从0到3。初始级别0,名为“邂逅”,它将总结使用C进行编程的基础知识。它的主要作用是提醒你我们所提到的主要概念,并使你熟悉C应用的特殊词汇。第1级“相识”详细描述了大多数主要概念和特性,如控制结构、数据类型、操作符和函数。 第2级“相知”是C语言的核心,完全解释了指针,使你熟悉C的内存模型,并使你能够理解C的大部分库函数接口。第3级“深入”详细介绍了特定主题,如性能、可重复输入、原子性、线程和泛类型编程。

图书特色

现代C:概念剖析和编程实践
[德]  延斯·古斯泰特(Jens Gustedt) 著
刘红泉?译
根据使用者对C语言的认识,按
“邂逅——相识——相知——深入”四个层次组织内容
进可精通,退可巩固,是一本全面且深入的C语言学习指南

图书前言

C编程语言已经存在很长时间了—它的权威参考资料是其创建者Kernighan和Ritchie写的一本书[1978]。从那时起,C语言就开始被大量应用。用C语言编写的程序和系统无处不在:个人计算机、电话、照相机、机顶盒、冰箱、汽车、大型机、卫星……基本上在任何有可编程接口的现代设备中都能找到。
与C程序和系统的普遍存在相比,人们对C语言的认知和了解要少得多。即便是经验丰富的C程序员,也会对C语言的现代演变表现出一定程度的知识缺乏。一个可能的原因是,C语言被看作一种“容易学习”的语言,它允许缺乏经验的程序员快速地编写或复制代码段,这些代码段至少看起来是在做它应该做的事情。在某种程度上,C语言并没有激发用户学习更高层次知识的积极性。
本书的目的是改变这种普遍的态度,所以它的内容分为4级,以反映对C语言和编程的熟悉程度。这种结构可能与读者的一些习惯相违背,特别是,它将一些困难的主题(如指针)分成不同的层次,以避免过早地向读者提供错误的信息。我们稍后将更详细地解释本书的组织结构。
一般来说,尽管本书会提出许多普遍适用的思想(也适用于其他编程语言如Java、Python、Ruby、C#或C++),但本书主要讨论C语言中特有的或者在用C语言编程时具有特殊价值的概念和实践。
C语言的版本
正如本书的书名所提示的那样,今天的C语言与它的创建者Kernighan和Ritchie最初设计的C语言(通常称为K&R C)不同。特别是,它经历了一个重要的标准化和扩展过程,现在由ISO(国际标准化组织)进行推动。这导致了在1989年、1999年、2011年和2018年一系列C标准的发布,它们通常被称为C89、C99、C11和C17。C标准委员会做了大量工作来保证向后兼容,比如用早期版本(如C89)编写的代码应该使用新版本的编译器编译成语义上等价的可执行文件。不幸的是,这种向后兼容产生了我们不希望看到的副作用,即那些原本可以从新特性中获益的项目没有动力来更新自己的代码库。
在本书中,我们将主要参考JTC1/SC22/WG14[2018]中定义的C17,但是在撰写本书时,一些编译器并没有完全实现这个标准。如果你想编译本书中的示例,至少需要一个可以实现C99大部分功能的编译器。对于将C11添加到C99所要做的修改,使用一个仿真层(比如我的宏包P99)就足够了,该软件包可在 http://p99.gforge.inria.fr上找到。
C和C++
编程已经成为一种非常重要的文化和经济活动,C语言仍然是编程界的一个重要元素。与所有人类活动一样,C语言的进步是由许多因素驱动的:企业或个人的利益、政治、美、逻辑、运气、无知、自私、自我(这里加上你的主要动机)。因此,C语言的发展不是也不可能是理想的。它存在缺陷和人为雕琢的成分,只能通过其历史和社会背景来理解。
C语言开发背景的一个重要部分是它的姊妹语言C++的早期出现。一个常见的误解是,C++是通过添加自己的特性而从C演化而来的。尽管这在历史上是正确的(C++是从非常早期的C语言发展而来的),但它们在今天并不是特别相关。事实上,C和C++在30多年前就已经从一个共同的祖先中分离出来,并且从那以后一直在独立地发展。但是这两种语言的演变并不是孤立发生的,多年来,它们一直在交流和采纳彼此的理念。一些新的特性,比如最近添加的原子性和线程,是在C和C++标准委员会的密切协作下设计的。
尽管如此,C和C++仍然有许多不同之处,而且本书中所讲的全部内容都是关于C的,而不是C++。书中所给出的许多代码示例甚至不能用C++编译器编译。因此我们不应该把这两种语言的起源混为一谈。
要点A C和C++是不同的:不要将它们混淆。
注意,当你阅读本书的时候,你会遇到很多如上所示的要点。这些要点总结了特性、规则、建议等。在本书的末尾有一个包含了这些要点的列表,你可以把它作为一个备忘单。
要求
为了能够从本书中获益,你需要满足一些基本要求。如果你对其中任何一个不确定,请先获取或学习它们;否则,你可能会浪费很多时间。
首先,如果不练习,你就无法学习一门编程语言,所以你必须有一个适当的编程环境(通常是在PC或笔记本电脑上),你必须在一定程度上掌握它。这个环境可以是集成的(一个IDE)或者是一组独立的实用程序。平台提供的内容千差万别,因此很难给出具体建议。在类似于UNIX的环境(如Linux和苹果的macOS)中,你可以找到诸如emacs和vim之类的编辑器,以及诸如c99、gcc和clang之类的编译器。
你必须能够执行以下操作:
1. 浏览文件系统。计算机上的文件系统通常按层次结构组织在目录中。你必须能够浏览它们来查找和操作文件。
2. 编辑程序文本。这与在字处理环境中编辑字母不同。你的环境、编辑器或它所调用的任何东西都应该对编程语言C有基本的理解能力。你会看到,如果你打开一个C文件(扩展名通常为.C),它可能会突出显示一些关键字,或者帮助你根据{}的嵌套来缩进代码。
3. 执行程序。你在这里看到的程序一开始是非常基础的,不会提供任何图形功能。它们需要在命令行中启动。编译器就是这样一个例子。在像UNIX这样的环境中,命令行通常被称为shell,其在控制台或终端上启动。
4. 编译程序文本。有些环境提供用于编译的菜单按钮或键盘快捷键。另一种方法是在终端的命令行中启动编译器。这个编译器必须遵照最新的标准,不要把时间浪费在不适宜的编译器上。
如果你以前从未编写过程序,本书学起来会很难。了解以下内容会有所帮助:Basic、C(历史版本)、C++、Fortran、R、bash、JavaScript、Java、MATLAB、Perl、Python、Scilab等。但是,你可能有一些其他的编程经验, 甚至可能没有注意到。许多技术规范实际上是用某种专用的语言编写的,可以作为一种类比,例如,用于Web页面的HTML和用于文档格式化的LaTeX。
你应该知道以下概念,尽管它们在C语言中的确切含义可能与你所学环境中的有所不同:
1. 变量—保存值的命名实体。
2. 条件句—在一个精确的条件下做某事(或不做某事)。
3. 循环—按一定的次数(或者直到满足某个条件为止)重复做某事。
练习和挑战
在本书中,你将看到一些练习,这些练习是为了让你思考所讨论的概念。最好在阅读本书时完成练习。还有一类叫作“挑战”。这些通常要求更高。你需要做一些研究,甚至要了解它们是什么,解决方案不会自己出现:这需要努力。完成挑战要花很多的时间,有时要几个小时甚至几天,这取决于你对工作的满意程度。这些挑战所涉及的主题来自我个人对“有趣问题”的偏好,这些问题来自我个人的经历。如果在学习或工作中有其他问题或涉及相同领域的项目,你应该也可以把它们做得同样好。最重要的是要训练自己,首先从其他地方寻求帮助和想法,然后亲自动手把事情做好。你只有跳进水里才能学会游泳。
本书结构
本书按级别组织,编号从0到3。
第0级“邂逅”总结使用C语言进行编程的基础知识。它的主要作用是提醒你我们所提到的主要概念,并使你熟悉C应用的特殊词汇和观点。最后,即使你在C语言编程方面没有太多的经验,你应该也能够理解简单的C语言程序的结构,并可以开始编写自己的程序。
第1级“相识”详细描述大多数主要概念和特性,如控制结构、数据类型、操作符和函数。它应该能让你更深入地了解运行程序时所发生的事情。这些知识对于算法入门课程和该级别的其他工作来说应该足够了,但值得注意的是指针还没有完全引入。
第2级“相知”深入C语言的核心。它完全解释了指针,帮助你熟悉C语言的内存模型,并使你能够理解C语言的大部分库函数接口。完成这一级别应该使你能够专业地编写C代码。因此,本级别首先对C程序的编写和组织进行了必要的讨论。我个人认为,任何从工程学院毕业、主修计算机科学或C语言编程的人都能达到这个水平。不要满足于比这更低的水平。
第3级“深入”详细介绍特定主题,如性能、可重入性、原子性、线程和泛类型编程。当你在现实世界中遇到这些问题的时候,你可能会发现这里的内容是最好的。作为一个整体,它们对于结束讨论并向你提供C语言方面的全部专业知识是必要的。任何在C语言方面具有多年专业编程经验的人,或者使用C语言作为主要编程语言的软件项目负责人,都应该达到这个水平。

上架指导

计算机\程序设计

封底文字

作为一种有50年历史的编程语言,C语言还是非常现代的。无论是编写嵌入式代码、低级系统例程,还是高性能应用程序,C语言都能应对挑战。本书基于新的C标准,从现代视角,深刻剖析了这种久经考验的语言的概念及实践应用。
本书介绍C编程,强调了这种强大语言独特和新颖的特性。为了满足初级C程序员的需求,本书从结构、语法、编译和执行等基础知识开始。然后,你将进一步了解控制结构、数据类型、操作符和函数,从而更深入地了解在底层发生的事情。在最后几章中,你将探索性能、可重入性、原子性、线程和泛类型编程。你将在编写代码的同时强化概念并磨炼技能。
本书的读者对象是可以轻松使用Java、Python、Ruby、C#、C++或C语言编写简单程序的程序员。
主要内容
● 运算符和函数
● 指针、线程和原子性
● C的内存模型
● 动手练习
“新”C语言的极佳教程。这不再是你祖父辈那时的C语言了!
  —— Hugo Durana
微软
阅读这本书就像有一位专家在你身边一样。
—— Glen Sirakavit
Data Recognition
自Kernighan和Ritchie以来关于C语言的另一本权威书籍。它是所有C程序员的必备图书。
—— Manu Raghavan Sareena
Arm
学习现代C语言的权威指南。
—— Sanchir Kartiev
Emerline
作者简介
延斯·古斯泰特(Jens Gustedt)
法国国家信息与自动化研究所(INRIA)高级科学家,并且是C标准文档ISO/IEC 9899:2018的联合编辑。

作者简介

[德]延斯·古斯泰特(Jens Gustedt) 著:Jens Gustedt在波恩大学和柏林工业大学完成了他的数学学业。他当时的研究涉及离散数学与高效计算的交叉。自1998年以来,他一直在法国国家信息与自动化研究所(INRIA)担任高级科学家,先是在法国南锡的LORIA实验室工作,自2013年起在斯特拉斯堡的ICube实验室工作。
在整个职业生涯中,他的大部分科学研究一直伴随着软件的发展,一开始主要是C++,然后又专注于C。他现在作为ISO委员会JTC1/SC22/WG14的专家为AFNOR服务,并且是C标准文档ISO/IEC 9899:2018的联合编辑。他还有一个成功的博客,涉及C语言编程和相关主题: https://gustedt.wordpress.com。

译者序

C语言的发展最早可以追溯到1960年出现的ALGOL 60。可以说,ALGOL 60是C语言的祖先,但是ALGOL 60离硬件比较远,不适合用来编写系统软件。1963年,剑桥大学推出了CPL(Combined Programming Language)。CPL对ALGOL 60进行了改造,更接近硬件一些,但是规模比较大,难以实现。1967年,剑桥大学的马丁·理查兹对CPL进行了简化,在保持CPL的基本优点的基础上推出了BCPL(Basic Combined Programming Language)。
1970 年,美国 AT&T 公司贝尔实验室的研究员肯·汤普森以 BCPL 为基础,设计出了非常简单而且很接近硬件的B语言(取 BCPL 的首字母)。B语言是一种通用程序设计语言,但它过于简单,且功能有限,所以没能流行起来。肯·汤普森用B语言做了一件很重要的事情,一直影响至今,即他用B语言写出了世界上第一个操作系统——UNIX 操作系统。
1971 年,贝尔实验室的丹尼斯·里奇加入了肯·汤普森的开发项目,合作开发 UNIX。他的主要工作是改造B语言,使其更加成熟。
1972 年,丹尼斯·里奇在B语言的基础上最终设计出了一种新的语言,他以 BCPL 的第二个字母作为这种语言的名字,即C语言。C语言既保持了BCPL和B语言的优点(精练、接近硬件),又克服了它们的缺点(过于简单、无数据类型等)。最初设计C语言只是为了提供一种可以描述和实现UNIX操作系统的工作语言。1973年,肯·汤普森和丹尼斯·里奇两人合作把UNIX中90%以上的代码用C语言进行改写,得到了UNIX第5版。
后来,C语言历经了多次改进,但主要还是在贝尔实验室内部使用。直到1975年,UNIX第6版公布以后,C语言的突出优点才引起人们的普遍关注。1975年,不依赖于具体机器的C语言编译文本(可移植C语言编译程序)出现了,将C语言移植到其他机器上所需做的工作因而大大简化,这推动着UNIX操作系统迅速在各种机器上实现。而随着UNIX的广泛使用,C语言也迅速得到推广。C语言和UNIX可以说是一对孪生兄弟,在发展过程中相辅相成。1978年以后,C语言已先后移植到大、中、小和微型计算机上,独立于UNIX和PDP计算机了。
现在,C语言已风靡全球,成为世界上应用最广泛的计算机语言之一。许多系统软件和实用的软件包,如Microsoft Windows等,都是用C语言编写的。
无论你是刚开始使用C语言还是已经有了很丰富的经验,通过阅读本书,你的C语言编程技能都将提升到一个新的高度。这本非常全面的指南是按级别来组织的,这使你很容易找到最适合自己的章节,从而更快获得更大的收益。
本书作者Jens Gustedt自1998年以来一直是法国国家信息与自动化研究所(INRIA)的高级科学家,工作领域包括算法、科学实验、粗粒度并行模型和分布式锁定。
在本书中,Jens Gustedt将教你使用这种久经考验的语言编写相关程序所需的技能和特性,应用范围包括Linux和Windows、设备驱动程序、Web服务器和浏览器、智能手机等。
由于翻译水平和时间有限,译文难免存在错误和疏漏,恳请读者批评指正。
希望通过阅读此书,你的C语言编程技巧能得到进一步的提升,从而可以从容面对当前所面临的一些挑战!

刘红泉
2021年2月于北京

图书目录

译者序
致谢
前言
作者简介
第0级 邂逅
第1章 入门 2
1.1 命令式编程 3
1.2 编译和运行 4
第2章 程序的主要结构 8
2.1 语法 8
2.2 声明 10
2.3 定义 12
2.4 语句 13
2.4.1 循环 14
2.4.2 函数调用 14
2.4.3 函数返回 15
第1级 相识
第3章 一切都和控制有关 21
3.1 条件执行 21
3.2 循环 24
3.3 多重选择 28
第4章 表达式计算 31
4.1 算术 33
4.1.1 +、-和* 34
4.1.2 除法和余数 34
4.2 修改对象的运算符 35
4.3 布尔情景 36
4.3.1 比较 36
4.3.2 逻辑 37
4.4 三元或条件运算符 38
4.5 求值顺序 39
第5章 基本值和数据 41
5.1 抽象状态机 42
5.1.1 值 43
5.1.2 类型 44
5.1.3 二进制表示和抽象状态机 44
5.1.4 优化 45
5.2 基本类型 46
5.3 指定值 49
5.4 隐式转换 52
5.5 初始值设定 55
5.6 命名常量 56
5.6.1 只读对象 57
5.6.2 枚举 58
5.6.3 宏 59
5.6.4 复合字面量 60
5.7 二进制表示 61
5.7.1 无符号整型 61
5.7.2 位集和按位运算符 62
5.7.3 位移运算符 63
5.7.4 布尔值 64
5.7.5 有符号整型 64
5.7.6 固定宽度整型 67
5.7.7 浮点数据 68
第6章 派生数据类型 70
6.1 数组 71
6.1.1 数组声明 71
6.1.2 数组操作 72
6.1.3 数组长度 72
6.1.4 数组作为参数 73
6.1.5 字符串是特殊的 74
6.2 指针作为不透明类型 77
6.3 结构 79
6.4 类型的新名称:类型别名 85
第7章 函数 87
7.1 简单函数 88
7.2 main是特殊的函数 90
7.3 递归 91
第8章 C库函数 98
8.1 C库函数的一般特性及功能 98
8.1.1 头文件 99
8.1.2 接口 100
8.1.3 错误检查 100
8.1.4 边界检查接口 101
8.1.5 平台前提条件 102
8.2 数学 103
8.3 输入、输出和文件操作 105
8.3.1 无格式文本输出 105
8.3.2 文件和流 107
8.3.3 文本IO 109
8.3.4 格式化输出 110
8.3.5 无格式文本输入 113
8.4 字符串处理和转换 115
8.5 时间 119
8.6 运行时环境设置 123
8.7 程序终止和断言 125
第2级 相知
第9章 风格 130
9.1 格式 131
9.2 命名 132
第10章 组织与文档 136
10.1 接口文档 137
10.2 实现 139
10.2.1 宏 140
10.2.2 纯函数 142
第11章 指针 147
11.1 指针操作 148
11.1.1 操作符的地址和对象 148
11.1.2 指针加法 149
11.1.3 指针减法和差 151
11.1.4 指针合法性 153
11.1.5 空指针 155
11.2 指针和结构 156
11.3 指针和数组 159
11.3.1 数组访问和指针访问是一样的 160
11.3.2 数组参数和指针参数是一样的 160
11.4 函数指针 161
第12章 C内存模型 167
12.1 统一内存模型 168
12.2 union 169
12.3 内存和状态 171
12.4 指向非特定对象的指针 172
12.5 显式转换 173
12.6 有效类型 175
12.7 对齐 176
第13章 存储 179
13.1 malloc和友元 180
13.1.1 具有可变数组大小的
一个完整例子 181
13.1.2 确保动态分配的一致性 188
13.2 存储持续时间、生命周期和可见度 189
13.2.1 静态存储持续时间 192
13.2.2 自动存储持续时间 193
13.3 题外话:在定义对象之前使用对象 194
13.4 初始化 196
13.5 题外话:机器模型 198
第14章 涉及更多的处理和IO 202
14.1 文本处理 202
14.2 格式化输入 209
14.3 扩展字符集 210
14.4 二进制流 218
14.5 错误检查和清理 219
第3级 深入
第15章 性能 226
15.1 内联函数 228
15.2 使用restrict限定符 232
15.3 测量和检验 233
第16章 类似函数的宏 242
16.1 类似函数的宏如何工作 243
16.2 参数检查 245
16.3 访问调用上下文 249
16.4 默认参数 252
16.5 可变长度参数列表 253
16.5.1 可变长参数宏 253
16.5.2 绕道:可变长参数函数 258
16.6 泛类型编程 261
第17章 控制流中的变化 268
17.1 一个复杂的例子 270
17.2 排序 272
17.3 短跳转 275
17.4 函数 276
17.5 长跳转 277
17.6 信号处理程序 281
第18章 线程 291
18.1 简单的线程间控制 294
18.2 无竞争初始化和销毁 296
18.3 线程本地数据 299
18.4 临界数据和临界区 299
18.5 通过条件变量进行通信 302
18.6 更复杂的线程管理 307
第19章 原子访问和内存一致性 310
19.1 “以前发生的”关系 311
19.2 C库调用提供同步 314
19.3 顺序的一致性 316
19.4 其他一致性模型 318
要点 320
参考文献 333

教学资源推荐
作者: [美] 约翰·戴维·斯通(John David Stone) 著
作者: [美]梁勇(Y.Daniel Liang) 著
作者: 曹青 邱李华 郭志强
参考读物推荐
作者: 黄传禄 罗凌云 丁士锋 编著
作者: 王冬生 著
作者: 郝冠军 著