选择什么教材来学习c语言?

上一篇文章我们讲到c语言的发明人丹尼斯·里奇(dennis ritchie),他于1972年左右发明了c语言,c语言里的时间/日期计算起点,有个unix timestamp(unix 时间戳)是 jan 1, 1970 utc。即 1970年1月1日,是unix元年。

c原因发明至今接近50年了,达到了知天命的年龄了。大家想想,你10年前使用的产品到现在还在用的能有多少呢?在高速发展的计算机领域,发展速度更是惊人,你之前经常浏览的网站、玩过的游戏能坚持10年的有多少呢?大家回头再看看c语言,在2019年7月的计算机语言排行榜上,50岁的c语言高居第2名!

2019年7月计算机语言排行榜

时间、流行度已经充分证明了c语言的生命力!大学大一新生一般都开设c语言的课程,选用的教材一般是谭浩强先生的,见下图:

谭浩强《c程序设计》第五版

红色的书皮、1400万册的发行量充分证明了它的使用率。但大家在知乎等上搜索这本教材,会发现怨言颇多(这里并没有对谭浩强先生表示不敬的意思),吐槽书中表述和程序错误颇多,最主要大家认为该书过于讲授语言的知识,而不是编程的快乐,以及用编程来解决实际问题的能力!

那如果让我来推荐一本学习c语言的教材,我会推荐本文要介绍的人物布莱恩·克尼汉和c语言发明人丹尼斯·里奇共同撰写的《c程序设计语言》!这里绝不是打广告。

k&r c程序设计语言

首先这本书很短小,288页而已,不会有太大的心理负担。抛掉不用的chapter 1和8,另外有时chapter 6 structures因为课时问题也会不讲,最多也就120-140来页,一点阅读负担都没有。另外,两位作者都善于写“教科书”,语言简洁清爽,解释却很清楚和规范。作为c的创造者和同时拥有丰富的开发经历(他们也是unix的开发者),他们给出的建议和选择的风格,都是非常有指导性。作为初学者,学规范的东西无疑是最为正确的选择。这里的规范,不仅仅是基本的代码形式上的规范。学了坏习惯再改总是一件困难的事情。

k&r

起初,c语言没有官方标准。1978年贝尔实验室正式发表了c语言。布莱恩·克尼汉(brian kernighan)和丹尼斯·里奇(dennis ritchie)出版了《the c programming language》。这本书被 c语言开发者们称为k&r,很多年来被当作 c语言的非正式的标准说明。人们称这个版本的 c语言为k&r c。至此,布莱恩·克尼汉(brian kernighan)和丹尼斯·里奇(dennis ritchie)两人简称k&r。

布莱恩·克尼汉

布莱恩·克尼汉在1942年出生在加拿大多伦多,他在普林斯顿大学取得了电气工程的博士学位,2000年之后取得普林斯顿大学计算机科学的教授教职。

他与shen lin合作共同完成了两个知名的np-complete优化问题的解决方案:图划分问题和旅行推销员问题。旅行推销员问题(travelling salesman problem, 又称为旅行商问题、货郎担问题、tsp问题)是一个多局部最优的最优化问题:有n个城市,一个推销员要从其中某一个城市出发,唯一走遍所有的城市,再回到他出发的城市,求最短的路线。

布莱恩·克尼汉除了和丹尼斯·里奇撰写了《c程序设计语言》之外,还撰写了《unix编程环境》,这本书对unix操作系统的编程环境做了详细而深入的讨论,内容包括unix的文件系统、shell、过滤程序、i/o编程、系统调用等,并对unix中的程序开发方法做了有针对性的指导。

布莱恩·克尼汉在普林斯顿大学为非计算机专业学生开设了一门介绍计算机技术基础的课程,根据课程讲义编写《d is for digital》——中文译名《世界是数字的》。书中解释了当今计算和通信领域的工作方式,包括硬件、软件、因特网等,讨论了新技术带来的社会、政治和法律问题。

布莱恩·克尼汉的最新著作

awk

awk是由alfred aho 、peter weinberger和brian kernighan这三个人创造的,awk由这个三个人的姓氏的首个字母组成。

awk早期是在unix上实现的,所以,我们现在在linux的所使用的awk其实是gawk,也就是gnu awk,简称为gawk,awk还有一个版本,new awk,简称为nawk,但是linux中最常用的还是gawk。

awk其实是一门编程语言,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器。可以利用awk命令,将一些文本整理成我们想要的样子,比如把一些文本整理成“表”的样子,然后再展示出来。

grep 、sed、awk被称为linux中的“三剑客”。总结一下这三个“剑客”的特长:

grep:更适合单纯的查找或匹配文本

sed:更适合编辑匹配到的文本

awk:更适合格式化文本,对文本进行较复杂格式处理

以下就是awk程序的示例: