豆瓣9.2!作为C语言三剑客的它今天依然能打!
The following article is from 异步图书 Author 异步图书
有这么一本书,豆瓣评分9.2,被程序员亲切的称为“鱼书”,它就是《C专家编程》,它并不是C语言入门教材,而是C学习的“第二本”书。这本书在全球畅销30余年,得到了ACCU主席Francis Glassborow倾力推荐,是影响了国内外好几代程序员的圣经级作品!
作者彼得·范德林登是SunSoft公司编译器小组成员,在本书中他从编译器的角度解析了C语言编程中数组、指针、链接等关键问题与应对技巧,并穿插了许多生动有趣的故事,让读者在轻松愉快的过程中掌握C编程技巧。
01
为什么还能读这个“老家伙”?
的确,作为30年前的书它的确可以称之为“老家伙”,有关于C编程语言的书可以说是不胜枚举,为什么还要选择这本书呢?
好看:IT趣事一箩筐,学习编程也能很好玩
太多的C语言教材既长篇大论又讲得枯燥,把本应该充满乐趣的编程搞得极其乏味。本书作者想让C语言学习变得快乐,让读者真正感受到编程过程中的乐趣。对于这个问题小异深有同感,不知道听多少朋友抱怨一些教材无聊透顶,还不如看官方文档有意思,那些书简直是消磨他们的学习积极性。
所以,本书中讲述了许多有趣的C语言故事和轶闻,把他自己亲历、听到、看到的有趣故事与实际确切的C语言问题联系起来,比如连接因特网的自动售货机、一个逗号和句号的误用可能导致NASA飞船无法起飞,以及一个C语言的缺陷怎样使整个AT&T长途电话网络瘫痪等。
这些有趣故事,不仅可以满足读者那颗“八卦”的心,还能够吸引读者读完这本书,不至于因为无聊半途弃书而去。有不少读者把这本书当成程序员的“沙发读物”——好看又有趣,还能真正学到专家知识,读完收获不菲,甚至还能再读几遍。
好用:从根本上解决C语言编程中的关键问题
本书不仅好看,它还好用,正所谓授人以鱼不如授人以渔。
作者作为一个资深的编译器、操作系统开发者,他更多的是从更深层次来观察和解释C语言的特性和在使用过程中容易出现的问题。从他的详细讲解中,我们能够明白这个错误为什么会出现,为什么C要那样做才导致这个错误出现等更深层次内容——我们不仅知道哪儿错了,还知道为什么错了,更知道怎么去避免错误!
很多朋友看到这本书的成书年代就会犯嘀咕:现在都是C 17,没准过阵子都要C 2.X了,这用的ANSI C的“老古董”还能看?
其实这就是本书精髓之所在,也是本书近30年后依然畅销、并被无数读者喜爱和推荐的原因:书中充满了很多可能需要多年实践才能领会的技巧、提示和捷径,这些与使用何种标准无太大关系。
30年前关于C的问题在困扰当时的C程序员,20年前还在让另一批C程序员困惑,10年前也一样,在今天,依然如此。比如作者在书中提出的一个在当时困扰很多程序员的问题:
typedef struct bar{ int bar; }
bar的真正意思是什么?
而在程序员必备Stackoverflow问答社区中,也有这么一个类似的问题:
▲ Stackoverflow上的提问
这个问题是2008年提出来的,距今(2022年6月)已经有13年7个月了,后面每年都有新的浏览、编辑增加,最近的编辑是在上个月——几乎每年都有不同的C程序员对此类的问题感到困惑,因为这是C语言本身导致的,只有从根本上去理解C,才能在实际编程中不再被这类问题搞得焦头烂额。
实际上,在C编程中关于语法、标准的问题都算不得什么问题,这一类问题甚至都不需要向同事什么求助,自己认真看下文档就能避免了。真正的问题是根植于C语言本身,是来源于更深层次的问题。作者作为C语言专家,掌握的相关技巧、智慧不会随着语言标准更换而落伍,相反因为它们出自于作者的编译器角度,只要C语言还是那个C语言,这些技巧和智慧便依然弥足珍贵,能够在任何时候帮助人们理解和掌握C语言。
与之类似的问题还有:
我怎样把一些大小不同的多维数组传递到同一个函数中?
为什么extern char *p;同另一个文件的char p[100];不能够匹配?
什么是总线错误(bus error)?什么是段违规(segmentation violation)?
char *foo[]和char(*foo)[]有何不同?
如果你对这些问题毫无头绪、满头雾水,这本书你一定要读!本书中详细解答了包括这些在内的更多让新手和老手C程序员都常常头疼的问题。
那么,接下来就和小异一起看看这本“老家伙”是如何让我们感受到编程的乐趣,体会到学习编程的快乐,真正搞定那些在C编程中遇到的困难,成为一个C编程专家的。
02
这个“老家伙”在讲些什么?
也正是因为它的“老”,本书才会真正去注重编程核心问题——如何避免错误,编写正确的程序。
应该从错误中自省,从而避免再次重复错误
作者认为C语言编程是一项具有挑战性的技术,需要多年历练才能达到较为完善的境界。虽然大部分人很快就能学会C语言中的基础知识,但要对其了解透彻成为C语言专家,却需要耗费很长的时间。
这其中的关键是什么?关键在于积累,积累习惯用法、代码片段和灵活的技巧;还有一个就是自省。自省,是一种进步的方法,也是成为编程高手不可忽视的方法。发现错误,认识错误,解析错误,然后对整个过程进行自省,找到解决这个错误的技巧,避免以后再次发生这种错误。
比如赋值与对比,几乎每个C语言编程新手都曾有过这样的代码:
if(i = 3)
正确应该是这样的:
if(i == 3)
一旦有过这样的“白痴”犯错经历,经过自省之后,一般就不会再犯——没有人想再一次变成“白痴”。有些程序员甚至养成了一种习惯,在比较式中先写常数,如 if(3 == i),这样如果不小心误用了赋值符号,编译器就会报错。
作者还讲了一个“价值2000万美元的Bug”的故事,和上面的例子一模一样:1993年他们SunSoft操作系统开发小组收到一个“一级优先”的Bug报告,如果不解决将损失一桩价值2000万的生意。经过多次紧张调试之后,他们发现了问题所在:
X == 2;
这是一个录入错误,本应该是一条赋值语句,现在变成了比较并且没有任何结果返回。就是这么一个简单的错误,差点搭上了2000万美元的生意,实在是过于离谱。这给我们敲响了一个警钟:不能小看这些似乎稀疏平常的问题,造成的后果可能非常严重!
全面讲解,C的关键问题不再出错
本书对于厘清指针的概念、了解内存和编译的知识、认识链接与程序运行结构等有着非常大的帮助,搭配每一章节都不缺席的有趣故事,就像看小说一样过瘾。而且每个章节都有几个有意思的栏目内容,比如“轻松一下”讲述一些行业内的八卦趣事;“编程挑战”对读者编写程序提供一些有效的建议;“小启发”栏目则是作者在实际工作中产生的一些想法、经验和指导方针,能够帮助我们在实际编程中获得更好的体验。
在讲完C的这些关键问题之后,作者用平实的语言来描述C++,让读者把它与自己熟悉的C语言特性联系起来,以便尽快入门。
你会C,所以C++不在话下
C++在作者看来并不复杂,从实用的角度讲是兼容C的,只是有些特性不支持而已,只要你会C语言,C++基本一学就会。所以想要完全理解C++,重点在于理解“面向对象编程”:
面向对象编程的特点是继承和动态绑定。C++通过类的派生支持继承,通过虚拟函数支持动态绑定。虚拟函数提供了一种封装类体系实现细节的方法。
也就是说,只要关注抽象、封装、声明、多态等重点内容,便可以轻松学会C++,因为剩下不太重要的细节,对于理解C++语言框架没什么影响。
在带领读者学完C与C++之后,作者给大家送上了一份大礼:程序员工作面试的秘密。
程序员面试题中的启发
在面试的时候,面试官不仅仅看重最终答案,也看重解答的过程:是深思熟虑后提出好几种可能,还是一有想法就脱口而出?是否针对自己的思路给出了强有力的论据?对于错误的策略是固执己见,还是根据实际情况完善答案?
作者在本书最后面给出了几个真实面试题,还给出了多个思路下的解题方法,我们可以用来检验一下自己对于C的掌握,看看自己的水平。然后根据作者提供的方案,拓展一下我们自己解题思路与编程思维。
比如这样一个面试问题:怎样才能检测到链表中存在循环?
看起来比较简单,很快可以给出答案:对访问过的每个元素进行标记,继续遍历这个链表,如果遇到某个已经标记过的元素,说明链表存在循环。
面试官增加了一个限制:这个链表位于只读内存区域,无法在元素上作标记。
稍加思索,还是可以给出答案:当访问每个元素时,把它存储在一个数组中。检查每一个后继的元素,看看它是否已经存在于数组中。
面试官眉头一皱,再加限制:内存空间非常有限,无法创建一个足够长度的数组。然而,可以假定如果链表中存在循环,它出现在前N个元素之中。
面试者沉思了许久,缓慢给出答案:设置一个指针,指向链表的头部。在接下去对直到第N个元素的访问中,把N-1个元素依次同指针指向的元素进行比较。然后指针移向第二个元素,把它与后面N-2个元素进行比较。根据这个方法依次进行比较,如果出现比较相等的情况就说明前N个元素中存在循环,否则如果所有N个元素两两之间进行比较都不相等,说明链表中不存在循环。
面试官大喜,再加限制:链表的长度是任意的,而且循环可能出现在任何位置。
面试者半天无语…
当然,这并不是标准答案,作者给出来也只是常见解答,主要在于打开读者的思路。现在公司的面试题,虽然题面换了些,但它们的内核没有改变。作者给出的这些面试题,对于今天的面试者来说依然具有非凡的指导意义。
03
经典跨越时间的限制
本书使用平实的文字,穿插C语言的轶事趣事,全方位地从底层开始解析了C语言各方面的关键问题,提供了非常多的编程技巧。让读者能够充满欢乐地读完这本书,真正感受编程的乐趣,体验到学习编程的快乐。深受读者喜爱,成为C语言编程经典,“C语言三剑客”之一。
在豆瓣上,本书获得了9.2的高分!读者纷纷表达自己对于本书的强烈认可与相见恨晚的惋惜。
这是一本古书。仿佛一个老人在你身边给你讲解他们曾经经历了什么,为什么会这样。
——读者 电子三脚猫
20多年前的书,现在读起来很过瘾
——读者 Zzzm
作者幽默风趣的写作风格时时逗乐我,看这本书真是一种享受,搭配c和指针,理清了指针的概念,也学到了很多关于内存和编译的一些知识
——读者 星晴还不错
核心:指针与数组,涉及到了操作系统部分知识,略显多余。但很精辟,不可谓是专编程。附录面试宝典有启发
——读者 遇见星空
此书在对c的客观叙述中将好的品味娓娓道来,语言跟作者自身工作十分匹配的编译器设计者角度的观点,这一视角下"嫁鸡随鸡,嫁狗随狗"似的语言使用教旨很难出现,所以语言在这里是一门工具,批判夸赞都来的十分自然。对于这门悠久历史,应用广泛的较底层语言或许是很难再对其自身做巨大的修改以修复历史遗留下的缺陷,但至少可以期望将它们说出来,让那些好的品味与设计出现在未来的语言中。
——读者 ANlEO
编程是快乐的,它本应该是快乐的,我们学习编程也应该如此。
在快乐地学习过程中,使用别人多年开发积累下来的经验,作为我们自省的材料,是一种非常好的选择。前人栽树后人乘凉,我们可以在阴凉下捧起这本书,听作者娓娓道来这棵树是如何种下的、是如何成长的,有多少人在这树下做出过有趣又好玩的事情……
文章编辑:沙鱼 审校:桐希
参考来源:
[1]彼得·范德林登.C编程专家.[M].北京,人民邮电出版社:2020.
福利来喽 ~
#留言有礼# 欢迎大家分享 作为C的难点,你在指针的学习上有什么技巧吗?
>>> 活动参与活动截止时我们会选择3名小锦鲤获得《C专家编程》赠书1本
特别申明:
1、一位用户1个月内只能有1次获奖机会,让更多粉丝受益活动才更有意义
2、每一位用户只有1次留言机会,不允许重复留言~
请大家记住这三个1哦
>>> 活动时间活动截止时间:2022 年 07 月 22 日 16:00 整
兑奖截止时间:2022 年 07 月 24 日 16:00 整