C语言四书五经是哪4本书?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言四书五经是哪4本书?相关的知识,希望对你有一定的参考价值。
C程序设计之四书五经自从Dennis M.Ritchie于1973年设计并实现C语言以来,计算机程序设计领域已经发生了巨大的变化。以C语言为根基的C++、Java和C#等面向对象语言相继诞生,并在各自领域大获成功。今天,C及其后裔几乎统治了计算机程序设计世界。可以这么说,C语言的诞生是现代程序语言革命的起点,它改变了程序设计语言发展的轨迹,是程序设计语言发展史中的一个里程碑。
然而,C并不仅仅是其他语言的起点和基础,否则它早已成为程序设计语言发展过程中又一个被遗弃者。和当初发明时一样,C语言今天依然至关重要。它的表达力、效率、简练、紧凑、对机器的最终控制以及跨平台的高度移植性,使其在系统编程、嵌入式编程等领域一直占据着统治地位,而C99标准的制订则再一次使C语言焕发出新的活力。下文介绍C程序设计领域中的几本好书,其中一些堪称经典。
1. Brian W.Kernighan, Dennis M.Ritchie,《C程序设计语言》,机械工业出版社
这是迄今为止在所有程序设计语言书籍中最广受尊敬的一部经典,是任何一名C程序员的必读之作。因为出自C语言的设计者Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan之手,它被昵称为“K&R C”。是它首先引入了“Hello World!”程序,这个程序几乎成了后来任何一本入门性程序设计语言书籍中的第一个例子。
如同C语言本身简洁紧凑而极具威力一样,这本书轻薄短小而极富张力。通过简洁的描述和典型的示例,它全面、系统、准确地讲述了C语言的各个特性以及C程序设计的基本方法,内容涵盖基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口以及标准库等内容。
简洁清晰是这本书最大的特色。这本小书可以教给你许多比它厚几倍的“大部头”的知识。我认为那些动辄洋洋洒洒拼凑出好几百页乃至上千页的技术作者应该好好向K&R学一学。对于中、高级程序员而言,如果希望迅速获得C语言的严肃知识而又不愿意多花费哪怕一丁点时间,这本书就是首选。
顺便说一句,这本书的索引制作非常出色,极具实用价值,这可能首先要归功于正文部分的简明扼要。此外,尽管它看上去很像一本教程,但其实更是一本写给专业程序员的指南。如果你不具备任何其他语言程序设计背景或基本的C语言知识,这本书也许并不适合用作你的C语言启蒙读物。
2. Perter Van Der LinDen,《C专家编程》,人民邮电出版社
C语言是严肃的程序员语言,但这并不意味着C语言书籍必须板着面孔说教。在这本被C程序员昵称为“鱼书”(封面上有一条“丑陋的”腔棘鱼)的著作中,作为SUN公司编译器和操作系统核心开发组成员之一,Peter淋漓尽致地展示了其深厚的技术沉淀、丰富的项目经验、高超的写作技巧以及招牌式的幽默。在这部作品中,作者以流畅的文字、诙谐的笔法将逸闻典故、智慧和幽默自然地融入技术描述中,读来宛若一本小说,极富趣味。
本书讲述了C语言的历史、语言特性、声明、数组、指针、连接、运行时以及内存使用等知识,揭示了C语言中许多隐晦之处,尤其深入解析了声明、数组和指针、内存使用等方面的细节。要想成为一名专家级C程序员,这些内容都是必须掌握的。和其他满是抽象例子的C语言书籍不同,这本书充满了大量的来自真实世界的C程序设计实例,它们对C程序员具有很高的参照价值。另外,每一章都以极富趣味的“轻松一下”收尾,而附录A“程序员工作面试的秘密”则是任何语言的程序员在应聘工作前增强自信的好材料。
我怀疑真正的C专家可能用不着看这本书 — 从内容到组织方式到行文风格都决定了这是一本轻松愉快的“从菜鸟到高手”的进阶读本,所以,它理应拥有更广泛的读者群。初级程序员往往更需要热情的鼓励,在阅读这本书的过程中,你定会深深地被作者对编程的激情所感染。
世间并无完美。我认为这本书的缺陷在于,和大多数平庸的C语言书籍一样,它画蛇添足地加入了一章关于C++的描述。在今天看来,这个描述既不全面也有失公允。不过,鉴于作者是在1994年从一名C程序员的角度去观察C++,这一点也就不足为奇了。
3. Samuel P. Harbison, Guy L. Steele,《C语言参考手册(第五版)》(影印版),人民邮电出版社
在C语言参考手册类书籍里,Samuel P. Harbison 和Guy L. Steele合著的《C: A Reference Manual》是非常出色的一本。这本手册的第五版新增了对C99标准的介绍,以便满足新时期C语言学习的需要。全书共分为两大部分,第一部分专注于C语言特性,第二部分则全面讨论了C标准库。本书涵盖C99、C89、传统的C、所有版本的C运行库以及编写与C++兼容的C代码等一切知识。
这本手册只是中等厚度,但它比“比它更厚”的其他参考手册更清晰地描述了C语言的现在和过去的方方面面。整本手册技术细节描述精确,组织条理清楚,内容完备详尽而又简明扼要。可以这么说,它在广度、深度和精度方面都是出类拔萃的。对于中、高级C程序员而言,这本手册值得常备案头,它几乎肯定要比K&R的著作使用频率更高。
2004年2月1日补充:我手头有这本书的中文版:《C语言参考手册》(机械工业出版社出版)。它在很大程度上减轻了我的查阅负担,不过偶尔也增加了理解上的困难。
4. David Hanson,《C语言接口与实现:创建可重用软件的技术》,机械工业出版社
C语言能够历经三十多年而不衰,一个重要的原因在于它的适应能力。在这“复用”、“面向对象”、“组件”、“异常处理”等先进机制漫天飞舞的年代,C语言仍然能够凭借它小而优雅的语言特性,在相当程度上满足现代软件体系架构提出的要求。只不过,想要达到这个程度,必须要在C的应用功力上达到最高层次。在嵌入式、系统软件以及对性能要求极高的系统开发中,开发人员必须达到这样的层次,熟练掌握C语言的高级特性,才能够同时满足效率和灵活性、复用性的要求。可惜,虽然C语言技术图书汗牛充栋,但是关注这个峰顶之域的作品却是屈指可数。David Hanson的《C Interfaces and Implementations》就是个中翘楚。
David Hanson是业内大名鼎鼎的自由编译器lcc的合作者。在这个项目中,他负责提供高度可复用的基础架构。在不断的实践中,他完全使用ANSI C形成了一整套可复用组件库。这套组件库架构清晰,性能优异,而且提供了很多高级的特性,比如类Win32 SEH的异常处理机制,可移植的线程库,高性能的内存池,丰富的可复用数据结构组件。David Hanson把他在创作这些组件的过程中所积累的心得以及对其源码的精致剖析原原本本地写在了这本书里。这样的著作,当然堪称C语言领域里的铭心绝品。难怪已故著名技术作家Richard Stevens对此书赞不绝口,他说:“这本书中的技术,对于大部分C程序员来说,已经遗忘得太久了。”对于希望能在C语言应用上达到最高层次的核心程序员而言,这本书是难得的必读之作。
其他
除了以上四本书以外,我还乐意推荐Andrew Koenig的著作《C陷阱和缺陷》(人民邮电出版社)和Deitel父子合著的《C How to Program》两本书。
Andrew Koenig是世界上屈指可数的C++专家,他的这本书可能是最薄的一本C语言经典。它简明扼要地讲述了C程序设计中的陷阱和缺陷,包括词法陷阱、语法陷阱、语义陷阱、连接、库函数、预处理器以及可移植性缺陷等,最后一章还给出了关于如何减少程序错误的建议以及前面各章问题的参考答案。尽管这个小册子成书于C89标准制定之前,然而,即使到了C99早已颁布的今天,书中提到的大多数陷阱和缺陷一如十五年前那样使我们警醒。
Deitel父子合著的《C How to Program》一直是非常好的C语言入门教程,我手头的中译本名为《C程序设计教程》(机械工业出版社出版,原书第二版)。除了对技术的正规描述(辅以许多简明扼要的例子)外,每一章后面都带有小结、术语、常见的程序设计错误、良好的程序设计习惯、性能忠告、可移植性忠告、软件工程评述、自我测验练习及答案等。整书内容清晰,组织良好,易于阅读和理解。值得一提的是,有许多入门书读完一遍即可扔掉,而这一本是个例外。
结语
以上这几本书很大程度上局限于描述C语言及标准库本身,如果希望学习更专业的、领域相关的C程序设计技术,你可以在选择阅读这几本书的基础上继续查阅专门书籍。此外,在C语言书籍领域,水平不相上下的作品有很多,这几本只是根据我自身的阅读体验而做出的推荐。
我并不是一名C程序员,我的大多数时间都花在C的后裔语言尤其是C++身上了。然而,正如你知道的那样,C++并不全是类和模板,不全是面向对象和泛型编程,在较低的层面,C++的各个实现一如既往在很大程度上兼容C。C++和C的亲密关系决定了每一本C语言经典都应该是C++程序员的读物。
这世界变化得真是太快。各色新事物层出不穷,让人眼花缭乱、目不暇接。人们也很容易被那些五光十色的花哨玩意儿所吸引,常常会忘记构筑过去、现在和未来的坚实基础。C语言就是这样的基础之一。今天,世界上有许多我们看不见的重要软件是用C语言(以及C++等)编写而成的,正是它们在默默地支撑着这个信息世界的运转。 参考技术A 一、The C Programming Language
C程序设计语言(第2版·新版)
原出版社: Prentice Hall PTR
作者: [美]Brian W.Kernighan,Dennis M.Ritchie
译者: 徐宝文 李志
书号: 7-111-12806-0
页码: 258
开本: 16开 版次:2-1
丛书名: 计算机科学丛书
出版社: 机械工业出版社
出版日期: 2004-1-1
定价: ¥30.00 二、Pointers on C
C和指针
原出版社: Pearson Education
作者: Kenneth A.Reek
译者: 徐波
书号: 7-115-11456-0
页码: 450
开本: 16开 版次:1-1
丛书名: C和C++实务精选
出版社: 人民邮电出版社
出版日期: 2003-9-1
定价: ¥55.00
三、Expert C Programming
C专家编程
原出版社: PH PTR
作者: Perter Van Der LinDen
译者: 徐波
书号: 7-115-10627-4
页码: 291
开本: 16开 版次:1-1
丛书名: C和C++实务精选
出版社: 人民邮电出版社
出版日期: 2002-12-1
定价: ¥40.00 四、C Traps and Pitfalls
C陷阱与缺陷
原出版社: Addison Wesley
作者: Andrew Koenig
译者: 高巍
书号: 7-115-10623-1
页码: 172
开本: 16开 版次:1-1
丛书名: C和C++实务精选
出版社: 人民邮电出版社
出版日期: 2002-11-1
定价: ¥30.00
如何系统学习C++?
C++ 真的是一门备受争议的语言,关于 C++ 的书籍也是浩瀚如海。
那几本 C++ 的四书五经想必大家也早已在各路学习路线中见过了。
不过没关系,今天你依然会看见它们的身影哈哈哈。
C++ 最大的缺点就是语法复杂,而且难学难精。
学习 C 语言也许一本 K&R 的《C程序设计语言》就够了,但是在 C++ 世界里,找不到这样一本书。
这是一个爱速成的年代,大多数人很难耐得住寂寞花很长时间去学习一门语言,所以《21天学通C++》的销量还蛮不错的。
但是很遗憾,别说 21 天,就是一两年也很难学通 C++ 。
学好过程,一定离不开读大量的书籍甚至标准库文档,
在这里,我也把 C++ 学习初略的分为几个层次:
一、入门
如果你之前没有 C 或者其它语言的基础,我建议看看网上的 C++ 入门教程,比如菜鸟教程、C 语言中文网上面。
这个过程你需要了解并且掌握所有编程语言中共同的、最基本的那些概念:
变量、常量、类型、循环、判断、数组、字符串、对象、输入输出等
然后还有 C++ 中一些特有的东西,比如命名空间 namespace、引用、模板等。
以及如何使用一些 STL 中的类库,比如 string、vector、find 之类的东西。
然后就是辅以大量的练习。
就那种 C++ 教程的课后练习题就足够了,类似水仙花数、四则运算计算器之类的东西。
如果对这些没什么兴趣,可以试试这个网站,
https://www.codewars.com/kata/search/cpp
有点像 LeetCode 刷算法题一样,这里针对每一个语法知识点都有一系列的练习题可供选择。
而且不仅包含 C++,其它几乎所有语言都可以在这里进行练习:
应该两三周就能过完菜鸟教程这种级别的指引吧。
到这里,你对 C++ 包含了哪些知识点大概有了一个整体的印象。
并且能够写上百行左右的程序,但是还是很难写出一个优秀的类。
接下来需要进行全面和深入的学习,算是真正的入门:
- 《Accelerated C++》(美国斯坦福大学的经典教材)
- 《C++ Primer》(大而全)
- 《The C++ Programming Language》(C++之父 Bjarne Stroustrup 所著)
这三本,其实各有优缺点,第一本优点是简短,仅仅两三百页,只有最为核心和主干的知识点。
而后两本则都是大而全,尤其是《The C++ Programming Language》。
这两本区别在于,一个是 C++ 大师所著,一本是 C++ 之父所著。
网上有人说 《C++Primer》是目前市面上唯一一本真正的从入门到精通的书,适合初学者;
《C++ Programming language》 是C++专家自学指南,顾名思义,适合有较深厚 C++ 功底的读者。
所以小北推荐的顺序是:
《Accelerated C++》->《C++ Primer》->《The C++ Programming Language》
对于这种上前页大部头我推荐的阅读方式是,以主题为划分,比如 C++ Primer 就明确的分为了:
- C++ 基础
- C++ 标准库
- 类设计者的工具
- 高级主题
如果有一定的基础的话,可以看着目录,看一些自己感兴趣的章节,完全没有必要从第一页开始挨着挨着读。
入门结束你应该掌握以下内容:
- 基础语言
- 类与面向对象
- 输入输出
- 字符串处理(类库和正则表达式)
- 容器类库
- 泛型算法
看着只有几个关键字,实际上每个展开都有很多内容需要学习。
学习过程中把后面的每一个练习题都自己敲一遍,自己多思考对比一下。
多用代码去验证自己的想法,尤其是指针、引用、构造、析构这些地方。
学习 C++ 以及日常开发一定要记得这几个网站,可以随时查阅一些语法的用法和标准库:
cppreference
cplusplus
isocpp
二、提高
看完 C++ Primer 这类书,写出来的代码在效率、规范上还是没那么 “C++”。
甚至会有内存方面的 Bug。
比如返回函数内局部变量的引用,经常 pass-by-value
而非 pass-by-reference-to-const
。
由于 C++ 是一门系统级编程的语言,你需要掌握一些 OS 方面的知识才能更好的使用。
尤其是内存编译链接这一块,比如堆、栈、静态链接、动态链接等等。
还有一些 C++ 里比较特殊的概念,比如 RAII 的资源管理方式、值语义与生命期、引用、右值引用等等。
这些东西似乎没有一本很系统的书籍可以帮助你掌握,只能在不同的书里吸收完善。
这一块,我也在路上。
这里给出一些在这些方面有帮助的书籍:
- 《Effective C++》
一言概括,就是帮助你快速习得一些 C++ 里正确的姿势。
否则你可能需要用几万行代码的经验才能慢慢悟出来。
- 《程序员自我修养》& 《CSAPP》
帮助你掌握一些系统级编程的知识。如内存管理、堆栈、链接这类在 C、C++ 中极其重要的概念。
- 《Linux多线程服务端编程》
这本书严格来说不是纯讲 C++ 的。
但是里面会有一些章节,关于 C++ 多线程编程、锁、线程安全、C++ 一些工程实践经验还不错。
- 《Google C++ Style Guide》
谷歌的 C++ 代码规范,写代码是一件专业的事,把代码写得漂亮、专业也是一项能力。
谷歌的代码规范算是 C++ 领域一个标杆了。
鹅厂很多代码规范也是基于谷歌的代码规范做了一些适应性的改进。
在学习编程之初就掌握良好的编码规范大有裨益。
三、进阶
上面提到的这些书重点在于如何使用、用好 C++ 这一个范畴。
而进阶,我认为则是研究语言一些 case 的具体实现,深刻的思考语言设计和演进本身。
这里分为三个部分:
Part1. STL 源码
侯捷老师说:源码之下,了无秘密。
为了更好的使用 STL,一个方法就是阅读 STL 源码 或者掌握部分实现:
《STL源码剖析》
这本书讲解了 STL 五大组件的底层实现。
包括内存管理、各类容器的数据结构实现、算法的实现等。
建议列为必读,可以帮助深入理解 STL 底层。
其中也有很多面试常考的知识点,如内存池、traits 技法、vector 动态扩容、set、map 等实现原理等。
Part2. 对象模型
《深度探索C++对象模型》
这本书其实就是围绕一个点:C++ 里的对象是在内存中是如何组织的。
这是每个章节内容:
- 关于对象
- 构造函数语意学
- Data语意学
- Function语意学
- 构造、解构、拷贝语意学
- 执行期语意学
我第一次看见这本书就被深深的吸引了,当时在学校,每天看八九个小时,花了大概一周刷完了。
看完这本书感觉自己对于 C++ 的底层实现机制有了更深的理解。
比如多重继承、菱形继承、虚函数底层的实现机制等等。
当然了,也有人会认为对象如何在底层实现属于 C++ 编译器实现细节,而非语言标准,不应该以实现细节倒推标准。
诚然如此,掌握实现细节还是会对你理解 C++ 有促进作用。
Part3. 语言设计与演化
这里重点是思考 C++ 语言很多语法的设计和演进方向,可以看看 C++ 之父 Bjarne Stroustrup’s FAQ、《C++设计与演化》。
设计与演化这本书重点在于通过 C++ 之父去窥见 C++ 的前世今生。
看完这本书的意义,功利一点来说,或许对于提高 C++ 编程能力没有太多帮助的,不像 Effective 是立竿见影的效果。
但是,对于加深对 C++ 的理解很有帮助。
想要更好的使用 C++ 构建好的、高效的系统,对语言本身的深入理解是先决条件。
另一方面,书中提到了很多语言设计的思想、哲学,这些,相信在学习其他编程语言的时候也是有帮助的。
四、关于书单
这篇文章中对于书籍,我的一个原则就是能省则省,因为 C++ 相关的优秀书籍实在太多了,我只想挑出每个阶段最有用的的书。
书不在多,贵在精。
看书也是一样的,我推荐书不一定都需要去看完,深入细致的阅读完一本技术书比走马观花似的阅读 N 本更有效。
当然了,后面我也会推出一份分门别类整理后的 C++ 书单供大家索引。
四、关于视频
对于初学者来说看书也许确实很难 get 到那个点,就像我大一看 C 语言的教材里说文件分为文本流文件和二进制流文件,当时我愣是理解不了。
很多对于会的人是常识的东西,对于初学者就是无法理解、很难的概念。
那也许通过别人讲授、视频的方式会更容易入门一点,这里推荐浙大翁凯的 C++ 视频。
翁凯老师无论是 C、C++、Java 的视频都讲得非常深入浅出,只能说水平越是高的人讲的课越容易明白。
这是网易云课堂地址:
https://study.163.com/course/introduction/271005.htm
另外还要推荐侯捷老师的一些列课程:
我当时看见这些标题:《内存管理》、《C++11》、《STL源码分析》…
简直如获至宝一样,一个寒假就把这些视频全看完了,对于 C++ 和内存管理方面理解提高了很多。
真的非常感谢 B 站、感谢这些讲师和分享者,甚至要感谢互联网时代!
他们让知识的传播变得更加的便捷,降低了后来者的学习门槛,当然啦也变相加重了内卷化hahah(逃
还有一个我最近发现的一个视频,是一个国外 C++ 游戏引擎开发工程师录制的一套偏向 talk 类型的教程,比较通俗易懂和深入浅出,
推荐一下:
https://www.bilibili.com/video/BV1Ay4y1i7Z6
END
送给学习 C++ 的同学一段翁凯老师讲课说的话:
学 C++ (计算机)一定要有一个非常强大的心理状态
什么呢
C++ (计算机)的所有东西都是人做出来的,别人能想出来的我也一定想得出来,在 C++(计算机)里头没有任何黑魔法,所有的东西只不过是我现在不知道而已
总有一天我会把它里面的细节搞明白的!
以上是关于C语言四书五经是哪4本书?的主要内容,如果未能解决你的问题,请参考以下文章