有哪些适合初学者学习C语言的书籍?

学习C语言不是一朝一夕的事,但不是十年就能掌握的。如何以最小的代价学习和掌握C语言是本文的主题。请注意,即使是“最小成本”也绝不是捷径,而是要在最短的时间内获得最大的收益,这也意味着你需要经历一个艰苦的过程。

第一,读一本好书,否则还不如不读。

所有初学者面临的第一个问题是:如何选择教材。良好的开端是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会给你分配一本很差的C语言教材。幸运的是,你可以重新选择。

著名教授谭浩强出版了一本书《C语言编程》,据说发行量超过400万册。据我所知,很多学校都会推荐这本书作为C语言教材。虽然我的名字(谭浩宇)和教授只差一个字,但我极其坚决地要黑他的书。这本书不是为计算机专业的学生写的,而是为需要参加计算机等级考试的其他专业的学生写的。这本书的主要缺点是:示例程序非常不专业,无法教会你编程应该掌握的思维方式;程序风格相当不好,会让你养成乱涂乱画代码的坏习惯;错误太多了。有人指出了这本书的数百个错误,其中有许多关键的概念错误。好了,这本书我不想说太多。有兴趣可以百度一下:)

Kernighan和Ritchie的《The C Programming Language》(中文译为“C Programming Language”)是一部经典之作,但旧版本的很多内容已经过时,与现在的标准C语言相差甚远。大家一定要看最新版本,不然还不如不看。另外,即使是最经典、最权威的书籍也不可能面面俱到,所以手边放一本C语言参考手册是很有必要的。C语言参考手册就是C参考手册,是对C语言标准的详细描述,包括了大部分C标准库函数的细节,可以算是标准C语言的最佳参考书。对了,最新的C编程语言是按照C89标准修订的,而C语言参考手册描述的是C99标准。可能会有一些出入,建议按照C99标准学习。还有一本书《C与指针》,也写得相当不错。英文名是“Pointers on C”,特别强调了指针的重要性,这是本书的一大特色。但是,这本书不太适合初学者。如果你学过C语言,有一些C语言的基础知识,但是不是很扎实,那么你可以试试这本书。相信只要懂了指针,C语言就不再神秘了。

如果你已经吃完了一本C语言教材,还想更进一步,那么有两本书是你必须要看的。第一本是C陷阱和陷阱,一本非常薄的小册子,内容非常有趣。需要说明的是,这本书是20多年前写的,里面提到的C语言的很多缺陷都得到了改进,但了解一些历史也不是坏事。然后就可以挑战专家级的C编程了。顾名思义,这本书相当难。一旦你认真阅读,理解透彻,你就可以放心地在简历上写上“掌握C语言”了。

记住一个原则,不要看你目前看不懂的书,那是浪费生命。如果看不懂,一定是缺少了一些必要的基础知识。此时,你要仔细分析你需要补充什么,然后去书店找关于这些内容的书。只有把基础知识补上,再回来学习,才能真正事半功倍。

第二,Unix/Linux还是Windows是个大问题。

不同的编程环境会造就不同思维的程序员。Windows程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更喜欢Makefile和console。显然,集成开发环境更容易使用。在Windows上学习C语言,只需要按几个基本的visual c++工具栏按钮,就可以开始写Hello,World!在Unix下,你需要一些控制台操作的基础知识。可能有人觉得Unix环境更简单,但是习惯的力量很大。大家对Windows的基本操作都比较熟悉,专门为了学习C语言而安装一个Unix系统,似乎有点不划算。

对于一个只知道Windows基本操作,连DOS是什么都不知道的新手来说,尽快做一些有意思有意义的事情是最重要的。用C语言写一个小程序,远比学习ls、cat等命令有趣。除此之外,如果要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程,Makefile的编写方法等等。

所以我建议初学者还是考Visual C++ 6.0(不是Visual C++)。NET)或者Dev C++作为主要的学习环境,也永远不要太纠结IDE的使用技巧,因为以后肯定要转向Unix环境。Visual C++ 6.0简单易用,调试直观,但其默认编译器对C标准支持不好,而Dev C++使用gcc编译器,对C99标准支持较好。对了,现在很多大学还在用Turbo C 2.0作为C语言课程的实验环境,这是相当不可取的。原因一是TC 2.0对C标准的支持很少,二是TC 2.0编译的程序是16位,这对于以后理解32位程序会造成很大的麻烦(当然用djgpp之类的东西可以让TC 2.0编译32位程序,但那也太多了。

当你学完一本C语言的教材,就必须转向Unix平台继续学习。几乎所有的C语言高级课程都是基于Unix平台的(比如C专家编程)。转变的过程是痛苦的。你需要面对各种复杂的命令,和Windows平台上的思维方式完全不同,但是痛苦是值得的。Unix和C是共生的,Unix的思维方式和习惯更符合C语言。在Unix下,你可以找到无数优秀的源代码让你读得烂熟于心,你可以轻松地查阅某个库函数的在线手册,还可以看到最好的代码风格(说到代码风格,我会写一篇文章详细描述)。

归结为一句话:对于C语言初学者,建议使用Windows系统和集成开发环境。准备“大师”方向时,请先转Unix平台。

第三,万事俱备,你就是东风。

已经选择了书,并且已经配置了环境。正所谓万事俱备,只欠自己的努力。请从书的序言开始,认真阅读教材。很多人喜欢直接从第一章开始读,这是不对的。前言是作者对全书的概括性介绍。作者一般会告诉你需要什么基础才能顺利看完这本书,可以帮助你检查自己是否具备基础知识。看完序言,还需要浏览目录,了解书的整体结构,顺便给自己安排一个学习计划。

学习C语言,一定要注意每一个细节。必须自己敲书上的示例代码。只有编译执行后的输出和书上的一致,才算学完了一个例子。如果不符,一定要认真查找原因。出了书中的例子,我还得“创造”一些例子。比如在学习运算符优先级的时候,我可以写几个相同的表达式,把括号放在不同的位置,看看有什么不同的行为,比如*p++和(*p)++,或者a = b == c,(a = b) == c和a = = (b = =)。自己抄的书里的例子,改造后的例子,自己创造的例子,都要认真分类保存,并在源代码里写一个简短的注释,说明这个例子的意图。

例完了,还有练习。我建议初学者独立完成所有练习,然后对比答案的代码,看看自己的代码有哪些不足,再尝试修改自己的代码。很多人不重视习题,这是一个很大的错误,因为作者通常在习题中讲解一些重要的道理,而不是简单的检验之前的知识。

也许你觉得学起来太慢了,其实不然。认真学习就不用回去了。后来学的时候发现前面没想通。那真是得不偿失。一般来说,看完整本书,无论是原封不动地从书上抄下来的,还是自己心血来潮写出来的,都要完成几千行甚至上万行代码,这对以后继续学习是一笔财富。以我自己为例。我在看《Windows核心编程》的时候(我只看了3/4的内容),不仅抄了书上的代码,还自己写了很多例子,一共5574行(unix下wc工具统计)。过了很多天,我早就忘记了Windows的系统编程,但是只要花几分钟把之前的代码翻出来了,我又会清楚的知道了。就是这个原因,好的记忆力不如烂的文笔。

认真阅读,认真抄写源代码,独立完成习题并做进一步的实验,最后把所有代码都留下来作为自己的经验和财富。绝对是辛苦的工作,事半功倍。当然,这种方法只适合学习需要掌握的技能。如果不是学C语言,要具体情况具体分析。

最后还有一个非常非常重要的点没有提到——代码风格。从一开始,你就必须强迫自己模仿最好的代码风格。因为代码风格太重要,内容太多,我会专门一篇文章详细讨论。请注意程序员之路——关于代码风格。