历史上最权威最经典的关于C语言的书是哪本

Python010

历史上最权威最经典的关于C语言的书是哪本,第1张

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++等)编写而成的,正是它们在默默地支撑着这个信息世界的运转。

C语言的百科介绍:C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。

对与C语言,个人也是会一点,只能说C语言写的东西比较底层,很难写出图形界面窗口程序。但是它的执行效率很高,如果非要给点介意的话:

1.首先你要有一个正确的态度,没有一个正确态度的人是学不好任何东西的。你如果真想学好C语言的话,你就要做好好好学它的准备,不要三心二意。

2.其次,你要了解你学这个语言的目的。你是想过计算机等级考试呢?

还是想真正想用这一门语言。这就有很大的区别,这决定你学习的程度。

3.再次,你要了解你需要的教材。什么样的教材才是适合你。你要认真的选,不要太随意了。因为不同的教材程度不同,也不一定适合你。

3.然后,就是学的问题了。你做好了上面的准备,就好好开始学了。可是学好一门语言,一个好的方法很重要的。你要从整体上来理解C语言,认识到C语言的优势,还有C语言的特点。C语言是面向过程的一门语言,特别强调各个程序的关系。像程序之间的调用,这是很平常的。

你需要大量的在机子上实现你的程序。运行环境可以是Cfree或者c++6.0.

最后希望你能学好

①、对于你能写这么长的问题描述,说明你很认真。

②、你的目的性较强,但是你也想有更加明确的目标,我可以给你讲一下怎么自己去寻找目标和路线以及怎样学习。

③、计算机专业领域一共有几个大方向,十几个分支方向,而每个分支方向又有几十个小方向,每一个方向的深入学习与熟练到一定火候都不是一朝一夕,互相之间也不是完全没联系的,但是你现在就应该选择一个大方向并在其中的一个小方向内深入(为什么要这么早就选择具体的分支方向?后面说)。

④、这里列出计算机的几个大方向(非编程开发类的我就不说了):

基本方向:

1、单片机、嵌入式方向

2、网络编程:涉及到服务器程序、客户端开发、脚本设计等。

3、系统编程:基础API开发、桌面开发、系统程序开发、服务程序

4、图形学:3D、2D、图像识别、人脸识别

5、音频:语音识别、音频解码、音频软件

6、编译原理:编译器设计、脚本解释器、虚拟机、非自然语言翻译系统

7、应用层开发:利用高层语言去开发表层应用

8、安全:反工程、病毒、反病毒、木马、反木马、软件破解、软件加壳

附加方向:

8、人工智能:遗传算法、神经网络、灰色系统等等

9、游戏设计:各种游戏引擎设计以及业务逻辑设计等

⑤、基本方向是你一定要选的,附加方向只是基于基本方向的一些锦上添花,但是不管你怎么选,最开始某些东西一定要深入而不是只是懂就够(当然你对自己要求似乎不会很低),我把这个列出来:

数据结构:下面其他理论的基础。

操作系统原理:理解操作系统的架构和细节,你才能对以后关于多线程、文件管理、内存管理、指令优先级等有一个正确理解和运用。

编译原理:能够升华你对计算机编程语言的理解,对以后出现的各种编译、解释、兼容、移植、优化、并发与并行算法等有一个深入理解。

数据库系统原理:这个是进入公司都要会的,也是大型软件开发的基础。

软件工程:这个是你能够在经验不足还能保证大项目正常完成的理论基础。

网络技术:这个是必须学的,因为目前几乎没有一款装几率很高的软件或者平台跟网络无关。

数学的话,主要是:离散数学、线性代数、高等数学、计算机图形学、概率论

以上几个基础就是你成为一个融汇各个主要分支牛人必须学的(当然不是指理论,而是理论+实践编码能力)

⑥以上都是大的基础,要一一攻破并深入学习,虽然网络时代计算机专业知识爆炸式的增长,但是以上几个基础掌握后,会发现,以后的什么新的理论和技术都是基于这些大基础,你就很容易理解了。

⑦我为什么开头不讲你要具体学什么怎么顺序学呢?因为那些技术你要掌握的话,根本可以自己解决,但是如果你由于兴趣,沉迷于一些自己可见的小范围技术的话,那么毕业后虽然也能找到不错的工作,薪水也可能高,但是不能成为一个大牛。

现在才开始讲学习顺序,虽然你说不要推荐书,不过我还是要用书来做顺序。

C语言是可以写很多核心和高级的东西,而不只是小东西,但是从你代码来看,居然用到了 goto,我不是说你那些程序用到GOTO有什么不好,而是一定要避免用GOTO,goto是错误之源,如果你有什么内容非要用到goto才能写到,说明你的编码技巧还有不少提高空间。

你的学习顺序应该是:

C:做一个超级马里奥出来,并能够读取文本脚本来更新关卡。

C++:写一个2D图形引擎,封装掉细节,实现面向对象设计和可复用设计,并且用到《设计模式》中提到的一些设计模式,这样才能算对C++有一个很好的掌握。

MFC:MFC技术虽然近期已经冷下来了,但是你能熟练掌握它,才能证明你的C++OO技术够纯熟,严格证明你掌握了MFC很简单,你只要用MFC做出一个杀毒引擎就差不多了。推荐的书有《深入浅出MFC》。

《Windows程序设计》:和MFC不同的是,用的是windows核心SDK,也就是API,这本书学完后,你才能从操作系统层面上算掌握了win32 平台下的机理(其实win64和win32大部分机理类似)。

C#:C#里集合了当代和前沿计算机科学里最先进的一些语法(虽然执行效率一直被人质疑),但是你学完C#并深入后,至少能够算是对计算机语言有一个更加深刻的理解了。如何证明你C#学的不错了?也很简单,再次写一个随便什么游戏,比如俄罗斯方块。如果更加证明自己呢?用它写一个P2P网络对战游戏。

(如果你注意的话,会发现我说的学习顺序都是沿着语言和某些技术的,为什么呢?因为这些语言和技术涉及到特定的领域技术和计算机理论思想,比如【真正】学完了C#的话,就不单指学完了C#,而是把多种语言范式都学习了一遍,以及现代的程序开发思维(因为里面用到了很多让你一劳永逸的技术))

以上5个步骤都是基础大步骤,要解决的话要没1-2年应该不够。

与此同时,要尽快选出文中你感兴趣的方向作为3-5年的长期方向,不要担心过早选择分支方向会有什么损失,因为计算机很多分支是相通的,只有你把分支方向深入进去,才能真正理解很多理论的实践意义。并且一旦你在某个分支领域形成了较强的优势(比如,到公司里只有你这方面最强),那么你就是稀缺人才。

关于大方向的步骤就不说了,你主要就是要把我说的这几个基础步骤先解决,同时平时要注重大方向理论结合实际去编码和开发。