现在的位置: 首页 > 综合 > 正文

C的困惑

2012年01月17日 ⁄ 综合 ⁄ 共 3916字 ⁄ 字号 评论关闭
文章目录

 

题记:本来题目想叫做“从C到无穷大”,太晦涩了。后来又想用“C、D、E、F……”,太不知所云了。于是,用了这个题目,它的缩写恰好就是CDEF。不管用什么样的题目,我所想表达的都一个意思,那就是C语言课程结束以后,我们该干什么。


  我们都学过很多课程,每门课程都有大纲,有教材。严格按照大纲学习,把教材烂熟于胸,这是一贯的学习策略,并靠此斩落考试无数,一路杀入大学。如果你学习C语言的目的仅仅是为了期末考试,至多再加上一个“二级”,那么请不要再继续阅读本文,因为后面的文字只会给你带来负面作用。一门真正的大学课程的学习应该是永无止境的,没有任何机构可以给它划个框框说哪些该学哪些不用学,也不会有任何教材能解答你未来会遇到的所有疑问。本文仅希望帮助那些热爱编程,并把编程当作未来旅程中不可缺少的元素的同学。帮助大家把C作为一个起点,去开拓无尽的未来。

怎样学会C

  

C是永远学不会的!

 

  仅从语法上说,C可能是所有高级语言中最简单的,最常用的关键字不会超过30个,语法规则也不复杂,没有需要死记硬背的“习惯用法”。如果C语言就像英语一样只是单词、语法,那么课程结束后所有人都可以说学会C了。每种自然语言都能用简单的文字与语法来描述复杂的大观世界,但并不是每个人都可以像爱因斯坦、霍金、马克思、李白、金庸等等那样用语言表达出令人景仰的内容。即便与你身边的人相比较,同样说汉语的你们也很难对同一个事物说出完全一样的观点。C语言亦然。它是一个语言工具,通过这个工具,我们表达我们对世界的理解,或者具体说,对程序的看法。眼界与思维直接影响着我们写下代码的漂亮程度。如果以总能写下漂亮代码作为学会C语言的判断标准的话,那么因为眼界与思维的锻炼是无止境的,所以C是永远学不会的,就像我们都还没有真正学会汉语一样。

  既然C有那么多可学的内容,那么我们该学什么呢?

学C学什么

  学C的目的并不在于要学会C,否则就太狭隘了。我们要利用学习C的机会,拓展自己的眼界与思维,锻炼能力,成为世界(包括计算机世界、编程世界)的主宰,而不是C语言的奴隶。

第一学学习

  “学习”是一个主动创造的过程而非被动接受。真正的学习需要主动去寻求广泛的知识,跟踪最新进展,综合思考判断各方观点,动手实践检验,进而形成自己的观点,再将其传播出去。C语言的学习也符合这个规律。

  经典书籍要读,手册和在线文档要经常查,Internet更是提供了接触最新知识的机会。这里推荐两个网站:http://www.csdn.net和http://purec.binghua.com(注:站长另谋新欢,此站已关)。后者是一名哈工大的学生在大四时创办的,以钻研深层技术为目标,被一位微软的员工评论为“牛人处处有,PureC特别多”。但真正能把全世界的牛人集中在一起的地方是Newsgroup:news://comp.lang.c。如果你不知道Newsgroup是什么,就马上去搜索引擎找答案吧(http://groups.google.com是一个适合新手的Newsgroup入口)。搜索引擎是最重要得知识来源,首推google.com。可惜工大校园内的机房基本都不能出国访问,所以baidu.com也勉为其难地不得不用一下,尽管它搜出信息的可用性和可信性都差一些。在此特别说明一下,英文阅读能力十分重要,别回避英文信息,因为总会有你不能回避的那一天。硬着头皮冲上去,很快你就会发现读英文比读中文快乐很多。

  如果对学到的知识一概接受,那就无趣了。当阅读范围扩张,会发现即便是权威的观点也会有很多矛盾,也会看到总有所谓“真理”被推翻。所以,带着“怀疑”的态度去阅读,可能更有利于习惯背书的中国学生开拓思维。C语言中就有很多历史悬案,喋喋不休地争论至今没有结果,比如缩进该用空格还是Tab,“{”是否该单列一行……。一定要有自己的观点,“尽信书不如无书”吗。

  学编程,上机的重要性远远大于看书。亲自动手编程序的学习效果比干啃书本要好上0xFFFFFFFF倍。上机不要就是敲书上的例子,那只能锻炼出打字员。干点儿有挑战性的事情,比如编个小游戏,做个恶作剧程序,更可以考虑开发共享软件。如果你感到无从着手,那就下载别人的源代码看。同时,千万不要把自己陷到TC2里面,把路子走得宽一些,VC、gcc、Dev-C++、Eclipse……,广阔天地,精彩无限。

第二学计算机

  除了C++,再很难找到别的高级语言像C这样与计算机如此接近。只有懂得了C语言与计算机的内在原理,才可能轻松、快乐地驾驭C。课堂教学能教会你类型、选择、循环、输入输出等,我喜欢称他们为C语言的“毛尖”,也就是连“皮毛”都没接触到。当每写下一行代码,不仅能想象到它的执行效果,更能熟知它将给CPU、内存和各种计算机设备带来什么时,那种感觉是非常奇妙且令人激动的。这种情况下,你才能感觉到你真正地是在驾驭C,用C来做一切你想做的事情,而不是在C的束缚下蹩手蹩脚地应付各种莫名其妙的问题。

  为了找到这种感觉,就不要满足于课堂与一本教材,更不要迷信非专业人士捧出的经典。现在我们有如此好的机会可以接触众多的世界级大师、小师的著作,那么就应该抓住机会去直接与它们对话。下面介绍一些适合于入门的顶级教材。[Deitel94]已经出了第四版,不过国内只能买到第二版,它是一本可以把你引上程序设计的正路的书。[Prata04]的作者写了一系列“Primer”书,本本经典,数次升级,内容充实。[Kelley97]也是一本经典教材,它的最大好处是没有中文版,可以强迫你用英语去思考。[Roberts94]非常另类,作者是斯坦福大学的计算机系的资深教授,著名的学院派计算机教育专家。它的书教的是编程,而不是C语言(scanf()在539页第一次出现),所以如果你想学习上乘的编程技术,这本书是非常好的入门读物,但如果想学精深的C语言,它就帮不上忙了。[Harbison02]是“大全”型的,可能是唯一一个为了随时翻阅而值得收藏的书,所以它不是一个入门书,但当作初学者的辅助参考书非常的不错。

  课程结束以后,首先要撕烂教材(没错,就是作者里有我名字的那本。撕烂了扔掉,总比让我频频在旧书市看到它更好过一些),然后马上去拜读[Kernighan88]。这本由C语言的设计者所著的书用极其简练却精确的文字描述着C,每次捧卷都能让人对C语言的理解更提高一层。如果想获得绝对精确的信息,除了看[C99]别无选择,虽然C99很难看。进而可以阅读[Kernighan99]和[Linden94]来提高自己的实际编程能力、扩大见识。前者偏重于技巧与数据结构,后者偏重于经验与原理,尤其是后者还能让你发现原来编程是天底下最有趣的事情。当随着编程量的增加,你犯的错误也越来越多的时候,找来[Maguire93],成为bug终结者。如果通过学习C语言你对计算机的深层原理产生了浓厚的兴趣,那么就看[Bryant02]吧。此外还有一本专门“贬”C语言的书——[Koenig89],也值得一看。这些书的作者兢兢业业地完成本职工作之余,还把很多相关但不在本书论述范围的内容以参考文献的形式推荐给读者。从参考文献出发,你可以发现更多值得品味的。

  国人原创的技术书籍虽然不比老外经典,但也有其价值,间或冒个精品。这里推荐一本[林锐03],它论厚重自然不比大师的书,但颇有特点,挺无厘头的,一些即兴的感慨也给编程添加了点点人情味。

第三学数学

  我学生阶段最大的憾事就是在本科时不仅没认识到数学的重要性,还对它产生了极其错误的看法,以至于今天一见到数学好的人就景仰得不敢抬头,自惭形秽。当初未遇名师指点,落此下场也算生不逢时。今以我的惨痛遭遇告诫大家,数学真的是百科之母,必须用精力好好孝敬。想体会数学的奇妙及现实、数学与C语言的完美结合,就到http://acm.hit.edu.cn去在线做题吧。

  数学在程序设计中被具体化为算法与数据结构,关于它们的书我读的不多,下面的介绍更多的是参考别人的评论而不是我个人的观点。数据结构比较简单,也应该先学习,建议看[Weiss96],然后过渡到算法。算法领域里就林林总总彩旗飘飘了,[Cormen01]可能是一个很合适的入口,它帮你总览算法,寻找自己感兴趣的领域再继续找别的书籍深入下去。算法领域里最重要的书是[Knuth98],非常经典,也非常大部头的三卷本,也非常贵,任何一个能读完哪怕其中一卷的人都足以令人景仰。我现在还只能把它们供奉到书架上。

C以后学什么?

  虽然C永远学不完,但绝不能抱C守缺。事实上,前面所述的很多内容已经不是C语言的范畴了,它们应该属于用计算机解决实际问题的技术。那么回到语言本身,C可能是大多数同学学习的第一种计算机语言,但它不应该是最后一种。

  计算机这个人类发明的最伟大的工具是每个人都无法回避的,随身带几种计算机语言,是潇洒走天下的一个有力保证。诚然说,考试过后还能再用上C的人是少数,但能不再编程的人在工科院校里还是很珍稀的。C语言强大,号称无所不能,可它并不是解决所有问题的最佳选择。没有任何一种语言可以包打天下,它们都有自己擅长的领域和不擅长的方向。我们必须要针对自己的领域特色选择一种或几种最适合的语言来自学,同时也不需担心学习C语言的历程会白费,因为语言之间的“形”虽然不同,但“神”都是相通的。本文第二部分里建议大家学习的内容里很多就是这“神”的一部分。

  能够超脱语言去思考程序设计的问题,才是真正的领会了编程的要旨。能把自己的思想用语言行云流水地表达出来,才是真正的编程高手。

抱歉!评论已关闭.