学好C语言的推荐路径

为何要学习C语言?

       为何要学习、使用C语言?为何要学习一个可能比本身都岁数大的编程语言?html

        选择一门编程语言,“为何而学”这个目的是最重要的,目的不明确就无法学好。这也是为何不少学生朋友在大学里必修C语言却以为没学明白的缘由。由于学习的目的不明确,学习固然也没有动力。还有一个缘由是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项目须要中产生,伴随着Unix的兴起而流行,语义简明清晰,功能强大而不臃肿,简洁而又不过度简单,实在是居家旅行工做学习必备之良友。前端

        C语言相比C++的优势之一就是最小惊讶原则,一是一二是二,不会在私底下产生一些莫名其妙的额外产物。用C++作个例子,好比这样一个函数原型void PassWithClassValue(COneClass clsParam1),稍微了解C++的朋友都会知道,若是你没有实现COneClass的拷贝构造函数,编译器会好心的帮你实现一个,并且在调用这个函数PassWithClassValue的时候,偷偷地调用拷贝构造函数产生一个临时对象做为参数传递,对于某些状况,好比编写操做系统这类必须优化性能的情景下,这些自觉得是的东西是很是邪恶的事情。git

       C语言自己只提供必要的语言特性,其它复杂一点功能如文件处理、数学计算等等都以库函数方式提供,甚至连malloc、free这种“必须有”的功能,也是以标准库函数的方式提供,而不是做为C语言核心出现。在伟大的著名的无所不包的《K&R》开头部分就提到了,for其实能够经过while来完成,只不过for能够写的更简洁,言外之意,对于C语言for其实不是必要的。跑题一点说,在其它程序语言中Lua能够说继承了C语言简洁的设计哲学,甚至连continue这种几乎必备的关键字都一直拒绝加入,在Lua的maillist以及wiki里都提到过continue这个问题,Lua语言维护者认为continue对于Lua而言不是必要的,也不考虑在后续版本中添加这个关键字。这种简洁哲学也让C语言的可移植性、便携性特别优秀,也使得不少嵌入式系统依然使用C语言做为主要编程工做语言。程序员

       Java语言有一个口号:“一次编写,到处运行”,就是跨平台这个噱头。实际上C语言从早期开始就几乎达到了“一次编写,到处编译”,在ANSI在1989年统一了C语言标准之后(称之为C89),只要特定平台上的编译器完整实现了C89标准,并且你的代码没有使用某些特殊的扩展(GCC以及微软都有本身的编译器特定扩展),那么代码必定能够编译经过,再实现一下操做系统相关的函数库,C语言的移植就是很简单的事情。能够用Lua做为例子,Lua自己是彻底遵循C89标准,没有使用任何特定扩展,这也保证了有C语言编译器的平台,均可以编译使用Lua。能够编译运行C语言的硬件平台能够从A排到Z,真是很是有意思的事情。github

       C语言也是一个比较少见的应用领域极为普遍的语言。好比编写操做系统这种高难问题,只有C++、汇编语言能够作到。C语言能够编写服务器端软件如Apache、Nginx,或者编写GUI程序,如GTK。大多数程序语言的初版是经过C语言实现,借助前面提到的“一次编写到处编译”,最大的保证了这些程序语言的可移植性。在Web开发领域,C语言的应用相对较少,这也是一种取舍的结果,Web开发须要使用PHP、Ruby、Python这样的动态语言,能够快速上线快速修改,能够最大程度知足用户时时变化的需求,这也是C语言的弱项。若是把程序语言的应用领域从硬件到管理软件、Web程序作一个很粗略从下到上的排列,C语言适合领域是比较底层靠近硬件的部分,而新兴语言比较偏重于高层管理或者Web开发这种相对贴近最终用户的领域。比较流行的混合开发模式是使用C语言编写底层高性能部分代码或后台服务器代码,而使用动态语言如Python作前端开发,充分发挥它们各自的优点力量。正则表达式

        提到C语言的缺点,经常是它缺乏这种或者那种特性,好比有人建议加入GC,有人建议加入并行或者并发支持,有人提到没有一个比较完整的相似C++的异常策略。这些特性有的能够经过引入第三方库来实现,但C语言的设计哲学其实决定了它不会像C++那样“很是强大”。即便引入了某些人指望的特性,依然会是某些人喜欢某些人不喜欢的情形,如今的功能对于C语言应用领域来讲已经够用,其它特性能够经过特定程序语言实现,而且经过C API与C语言编写的程序进行交互。任何一个工匠都不可能只使用一个工具完成他的工做,不一样工具结合起来才能更快更好的完成任务。算法

        提到C语言的API,也稍微介绍一下,咱们知道windows操做系统的api也好,Linux的系统api也好,或者是想给Ruby、Python编写扩展模块,C语言形式的函数定义都是惟一的选择。C语言就好像是一个中间层或者是胶水,若是想把不一样编程语言实现的功能模块混合使用,C语言是最佳的选择。编程

       提了这么多关于C语言的好处,那么学习C语言是否适合就看你本身的判断了,例如要进行一个嵌入式项目,或者须要进行服务器端开发,或者写一个性能相关的组件等等,C语言都是比较好用的选择。另外也能够在C++的使用过程当中有意的使用C语言的思考方式,汲取C语言简洁明快清晰地设计思路,对编程设计水平会有很大的提升。windows

C语言学习方法

       C语言学习能够按照下面参考的顺序:阅读参考书,阅读代码,编写调试实际程序,上网参与讨论,研究高级话题。api

       学习语言的开始通常是阅读参考书。我建议选择几本很是经典的好书,仔细完整反复阅读几遍,“书读百遍其义自现”。选择C语言学习的好处是,这几本书基本上完整涵盖了C语言编程领域的方方面面,不会像C++那样,即便读完一堆书仍是有些糊涂,依然有这样那样难懂的陷阱。

1. 参考书籍

        在豆瓣上列了一个书单,你们能够直接参考http://book.douban.com/doulist/636329/。在下面简单点评一下,阅读顺序最好参照列出的顺序。

       《The C Programming Language》http://book.douban.com/subject/1230004/:若是你只想买一本书学习C语言,只须要买这一本就够了。若是你经费足够,建议你多买几本,办公室、家里都放上一本,随手均可以翻翻。用三个词语来形容它就是:经典!经典!经典!这本薄薄的只有二百多页的小书涵盖了C语言的方方面面,前无古人并且后无来者,任何溢美之词都不足以形容它。

      《The C Programming Language》(后面称为 K&R)里面包含了一个简单的语法解析器,包含了malloc如何实现,包含了一个完整的操做系统目录浏览程序,这些程序的实用性极高,能够这样说,若是学习任何一门语言可以本身独立动手实现以上的功能,基本上就能够算是入门了。K&R书里面每段都蕴含着很是值得探究的软件开发工程实践经验,若是没有必定的开发经验,实际上是看不出来这些冰山下面的内容的,好比开头一章就提出用写完整代码这种方式来教学,而在书中那些C语言的陷阱或者可能出问题的地方,都有提到,可是因为篇幅所限,写的很是简约,很难让人一下就看懂。我正在完整的逐字逐句的阅读此书,但愿能稍做注解,写几篇博客分享一下。

      《C程序设计语言(第2版·新版)》http://book.douban.com/subject/1139336/:这是K&R的中文译本,能够先从中文译本看起,而后再读一遍英文原版,既能够学习英文,又能够体会原文那种简约优美的风格。

      《C陷阱与缺陷》http://book.douban.com/subject/2778632/

      《C专家编程》http://book.douban.com/subject/2377310/

        这两本书也是学习及使用C语言的朋友必备的两本书,好比《C专家编程》,专门用两三个章节详细介绍C语言中数组与指针的不一样之处,这两本书在某种程度上算是对K&R略过的地方作了详细补充,强烈推荐。

      《C语言参考手册》http://book.douban.com/subject/2132084/:这是最后一本强烈推荐你最好买回家做为案头书必备的参考书。前面几本书或者稍显简略,或者专一某个特定专题,都不适合遇到问题时翻查。这本《C语言参考手册》能够看做是C语言编程的《新华字典》,全面而权威。里面还涵盖了C99的内容,紧跟时代潮流。

       下面几本书均可以做为交叉参考,也都颇有价值,也是建议你们都买下来,好书如朋友,日久弥新,像是我推荐的这几本书在douban或者amazon上评分都很是高,并且反复再版。

      《C和指针》http://book.douban.com/subject/1229973/:指针的重要性如何,学过C语言(或者C++)的朋友都知道,这本书更是把指针拔高到了与C语言分庭抗礼的地位,其实也是从头开始介绍,做为教学参考书也是能够的。

      《C标准库》http://book.douban.com/subject/3775842/:这本书是专门介绍C语言的标准库如何实现的,好比malloc算法,用标准的C语言该如何写?strlen这个函数应该如何实现?尽管书中很多代码与真实的C标准库相差不少(因为标准库须要考虑性能优化,不少函数有一些特定的trick),可是绝对值得参考。

      《你必须知道的495个C语言问题》 http://book.douban.com/subject/3422332/:这本书其实就是C-FAQ的印刷版本,C-FAQ在各类编程语言的FAQ中能够称得上质量一流。若是你想应聘或者招聘C语言相关程序员,这本书必定要参考。

      《Linux C编程一站式学习》http://book.douban.com/subject/4141733/:这本书是基于特定操做系统Linux来介绍C语言编程,可做为计算机相关专业的教科书或入门参考书,也是书单里面惟一一本国人原创的编程书籍,很是可贵。书中几乎全部内容都在网上直接公开,针对读者的意见进行修改,这也是很是可贵的一种开放态度。很是推荐你们买一本。

        学习C语言,必定不能只读书,应该动手练习完成书里面的项目需求(好比编写一个目录浏览器)以及每章的练习题目。这就须要有能够实验的环境,下面针对不一样操做系统简单作一下介绍。

       另外建议你们申请一个github.com的帐号,在gist.github.com能够保存本身的练习代码,就不须要随身带着U盘了。

2. 网络资源

        若是想用十分钟时间了解一下C语言的前因后果、前世此生,维基百科这个页面http://en.wikipedia.org/wiki/C_%28programming_language%29 是最佳选择。

        从维基百科能够看到,C语言1972年由Dennis Ritchie设计的命令式、结构化范式编程语言。类型为静态的弱类型,须要显式定义。最新国际标准为C99。设计上主要受到了B、ALGOL6八、汇编语言、PL/I、FORTRAN的影响,C语言也影响了大量编程语言,如C++、Objective-C、C#、Java、Go、PHP、Python等等(我的以为受C影响很大的是PHP,基本上有C编程基础的程序员,很容易就能上手PHP了,除了PHP的OO部分)。

        在维基百科条目中有很大篇幅介绍了做者认为C语言缺失的特性,好比面向对象、多线程、GC、异常处理等等,固然这有些吹毛求疵,若是须要这些特性,彻底能够用其它程序语言。另一个介绍的重点是“未定义行为”,有些咱们认为理所固然的结果,其实在C语言标准中并无明肯定义,假定这些行为应该如何,当程序使用另外的编译器或者不一样版本编译器编译运行,均可能有bug产生。 

       接下来维基百科条目谈到了C语言的用处,必须认可尽管如今编程语言成百上千,能称之为“系统级”的少之又少,新兴语言中只有Go还能称得上。如今大规模软件项目中彻底选用C语言可能性不大,可是核心部分彻底能够用C搭建,相对C++开发工具的高昂价格,C语言相关的免费辅助开发软件很是丰富,好比splint,valgrind,很多核心库通过长期使用也都很是稳定。

      因为C语言普遍支持各类平台以及编译器相对成熟可靠,很多编程语言选择C语言做为一个中间层,好比Glasgow Haskell编译器就是这样作的。

       另外一个能够找到大量C语言编程相关资料的地方是“美味书签”,经过搜索特定关键字 (C + programming)就能够找到不少值得挖掘的资源http://delicious.com/search?p=c+programming。还能够参考dmoz.org的C语言分类http://www.dmoz.org/Computers/Programming/Languages/C/ 相比美味书签时效性能差点,可是分类比较系统,查找也要容易一些。

       程序员每每是懒惰的,“拿来主义”、“拷贝主义”很流行也颇有效,当对某个函数或者关键字不是很理解的时候,看看别人是怎么使用的,会很是有启发性。这里介绍几个经常使用的代码搜索网站,最经常使用的是google的codesearch:http://codesearch.google.com ,能够经过不一样条件及正则表达式搜索特定关键词。另外能够参考维基百科上一个“带有C语言示例的文章”分类,里面代码写的也很不错。还能够在github.com上搜索相关项目。在前面博客文章我还介绍了一个名为罗塞塔代码的网站http://rosettacode.org/ 这个网站上能够找到不一样程序语言针对某个问题的解决方案,用于学习比较很是便利。

       学习编程也须要大量阅读名家经典代码,与学中文英文须要大量阅读名著一个道理,C语言编程优质项目那是“彩旗飘舞,人山人海”,我的建议能够看看Lua、Sqlite、Nginx这些项目的代码,代码量很少,并且代码质量也都比较高。另外能够看看Linux内核代码,坊间有很多书籍能够帮助解读。关于如何很好的阅读代码,你们能够参考《Code Reading》这本书。

       书看了几本,代码写了一些,也略微读了读其余人的代码,就应该用C语言来完成真实工做中碰到的问题,让C语言真正成为你的瑞士军刀。只有当你常用C语言来进行编程工做,常常思考如何经过C设计一个优雅高效的系统,才能更深入的理解C语言设计哲学。

       还能够到http://stackoverflow.com 参与回答问题,浏览其余人的问题解答来汲取知识,好比这篇http://stackoverflow.com/questions/2054939/char-is-signed-or-unsigned-by-default 就介绍了一个C语言关于char类型的小陷阱。

       C语言学习当中,有一些难点须要多加注意,如pointer与array的不一样之处,复杂类型定义如何解读,如何正确使用预处理preprocessor以及宏定义。其实这些内容在前面书籍都是反复提到,若是循序渐进学习下来,应该不成问题。

       当C语言学习的差很少时候,还能够学习一门动态语言,好比Lua或者Python,试着在实际工做项目中混合使用动态语言与C语言,一加一发挥出来的力量不只仅是二,而是很是二(说笑一下,哈哈)。

                          转载:http://www.nowamagic.net/librarys/veda/detail/264

相关文章
相关标签/搜索