漫谈C语言及如何学习C语言--http://my.oschina.net/apeng/blog/137911
目录:[ - ]
- 为什么要学习C语言?
- C语言学习方法
- 1,参考书籍
- 2,动手实验环境搭建
- 3,网络资源
- 附录
- 一些有用的C语言网络资源:
- 一些值得关注及研究的C语言相关项目:
- 一些C语言编程时可以使用的工具软件,帮你提高代码质量:
- C语言编程规范编程标准:
- C语言编程电子书及教程:
在这里想比较系统的谈谈个人对C语言学习方法的理解。分别按照书籍、实验环境搭建、网络资源来分别介绍,希望能写的比较完整全面一些,给想学习C语言的朋友一个有价值的参考。
为什么要学习C语言?
为什么要学习、使用C语言?为什么要学习一个可能比自己都岁数大的编程语言?
我在前面如何学习编程语言的博客文章http://sunxiunan.com/?p=1597 里提到,选择一门编程语言,“为什么而学”这个目的是最重要的,目的不明确就没法学好。这也是为什么很多学生朋友在大学里必修C语言却觉得没学明白的原 因。因为学习的目的不明确,学习当然也没有动力。还有一个原因是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项目需 要中产生,伴随着Unix的兴起而流行,语义简明清晰,功能强大而不臃肿,简洁而又不过分简单,实在是居家旅行工作学习必备之良友。
C语言相比C++的优点之一就是最小惊讶,一是一二是二,不会在私底下产生一些莫名其妙的额外产物。用C++做个例子,比如这样一个函数原型 void PassWithClassValue(COneClass clsParam1),稍微了解C++的朋友都会知道,如果你没有实现COneClass的拷贝构造函数,编译器会好心的帮你实现一个,而且在调用这个函 数PassWithClassValue的时候,偷偷地调用拷贝构造函数产生一个临时对象作为参数传递,对于某些情况,比如编写操作系统这类必须优化性能 的情景下,这些自以为是的东西是非常邪恶的事情。
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, 真是非常有意思的事情。
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语言简洁明快清晰地设计思路,对编程设计水 平会有很大的提高。
C语言学习方法
在前面http://sunxiunan.com/?p=1597 曾经提到过一个比较系统学习一门新的编程语言的方式,C语言学习也可以按照类似的顺序:阅读参考书,阅读代码,编写调试实际程序,上网参与讨论,研究高级话题。
学习语言的开始一般是阅读参考书。我建议选择几本非常经典的好书,仔细完整反复阅读几遍,“书读百遍其义自现”。选择C语言学习的好处是,这几本书基本上完整涵盖了C语言编程领域的方方面面,不会像C++那样,即使读完一堆书还是有些糊涂,依然有这样那样难懂的陷阱。
1,参考书籍
在豆瓣上列了一个书单,大家可以直接参考http://book.douban.com/doulist/636329/
在下面简单点评一下,阅读顺序最好参照列出的顺序。
《The C Programming Language》http://book.douban.com/subject/1230004/
《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/
下面几本书都可以作为交叉参考,也都很有价值,也是建议大家都买下来,好书如朋友,日久弥新,像是我推荐的这几本书在douban或者amazon上评分都非常高,而且反复再版。
《C和指针》http://book.douban.com/subject/1229973/
指针的重要性如何,学过C语言(或者C++)的朋友都知道,这本书更是把指针拔高到了与C语言平起平坐的地位,其实也是从头开始介绍,作为教学参考书也是可以的。
《C标准库》http://book.douban.com/subject/3775842/
《你必须知道的495个C语言问题》 http://book.douban.com/subject/3422332/
这本书其实就是C-FAQ的印刷版本,C-FAQ在各种编程语言的FAQ中可以称得上质量一流。如果你想应聘或者招聘C语言相关程序员,这本书一定要参考。
《Linux C编程一站式学习》http://book.douban.com/subject/4141733/
学习C语言,一定不能只读书,应该动手练习完成书里面的项目需求(比如编写一个目录浏览器)以及每章的练习题目。这就需要有可以实验的环境,下面针对不同操作系统简单做一下介绍。
2,动手实验环境搭建
也没有调查过,不知道现在学校里学习C语言是不是依然跟着谭浩强老师用TurboC2.0编程,如果还是这个组合的话,那就太差劲了,赶快抛开它们。
下面主要介绍不同操作系统平台下的集成编程环境,基于初学者以及我个人喜好,就不推荐大家命令行下用vim编程了,直接上IDE。
另外推荐codelite,相比codeblock,这个更新的更频繁一些。也支持各种比较有用的插件、调试特性、WX等等。
如果需要做Windows操作系统的开发,可以下载Visual C++ 2010 Express。
主页:http://www.microsoft.com/express/windows/
主页:http://netbeans.org/features/cpp/index.html
如果使用苹果Mac系统,毫无疑问XCode就是编程的绝佳选择,XCode可以在苹果开发者网站上免费下载,在IPhone SDK中也包含了XCode。
主页:http://developer.apple.com/technologies/tools/xcode.html
如果手头没有合适的编程环境,还需要实验一些简单的代码,可以用http://codepad.org/ 提供的服务,在线编写运行代码。
另外建议大家申请一个github.com的账号,在gist.github.com可以保存自己的练习代码,就不需要随身带着U盘了。
3,网络资源
如果想用十分钟时间了解一下C语言的来龙去脉、前世今生,维基百科这个页面http://en.wikipedia.org/wiki/C_%28programming_language%29 是最佳选择。
由于C语言广泛支持各种平台以及编译器相对成熟可靠,不少编程语言选择C语言作为一个中间层,比如Glasgow Haskell编译器就是这样做的。
当C语言学习的差不多时候,还可以学习一门动态语言,比如Lua或者Python,试着在实际工作项目中混合使用动态语言与C语言,一加一发挥出来的力量不仅仅是二,而是非常二(说笑一下,哈哈)。
附录
一些有用的C语言网络资源:
C语言标准化组织ISO JTC1/SC22/WG14的主页,在这里可以找到ISO C的文档:http://www.open-std.org/jtc1/sc22/wg14/
“C语言全景”这个网站内容很全面:http://www.softpanorama.org/Lang/c.shtml
Dan Saks在embedded.com上的专栏Programming Pointer ,里面文章很有深度,值得一读。
http://www.lysator.liu.se/c/c-www.html 这也是一个C语言资源汇总页面。
http://www.ioccc.org/index.html 混乱C语言代码大赛,很著名。
http://en.wikipedia.org/wiki/Underhanded_C_Contest 另外一个C语言编程大赛,主要面向黑客。
comp.lang.c以及c.moderated这两个讨论组推荐订阅,相当于互联网最大的C相关编程问题论坛:
http://groups.google.com/group/comp.lang.c
http://groups.google.com/group/comp.lang.c.moderated
这里对C语言的各种bit操作做了收集整理,不少题目在面试时候经常出现。http://graphics.stanford.edu/~seander/bithacks.html
台湾的惯C达人Jserv博客,建议大家订阅:http://blog.linux.org.tw/~jserv/
一些值得关注及研究的C语言相关项目:
TinyCC,被很多项目用作动态编译C语言的编译器引擎:http://bellard.org/tcc/
GCC的标准库实现:http://en.wikipedia.org/wiki/GNU_C_Library
Glib是GTK的底层辅助编程库,与C标准库是不一样的,在C语言上实现了面向对象机制:http://en.wikipedia.org/wiki/GLib
dietlibc在前面博客文章介绍过,C标准库的另一种实现:http://www.fefe.de/dietlibc/
一些C语言编程时可以使用的工具软件,帮你提高代码质量:
http://www.dwheeler.com/flawfinder/
PMD可用于检测重复代码 http://pmd.sourceforge.net/cpd.html
llvm的静态分析项目 http://clang-analyzer.llvm.org/
C语言编程规范编程标准:
http://en.wikipedia.org/wiki/MISRA_C
http://www.eecs.harvard.edu/~ellard/CS50-96/programming-style.html
http://developers.sun.com/solaris/articles/secure.html
http://www.cs.utah.edu/dept/old/texinfo/standards/standards_toc.html
C语言编程电子书及教程:
http://publications.gbdirect.co.uk/c_book/ 这一本写的非常详细,你可以把它看成是类似谭浩强版的教科书。
http://www.knosof.co.uk/cbook/cbook.html 这一本云风曾经推荐过,相当深入的介绍了C99标准,深入细节时候需要读读。
http://www.duckware.com/bugfreec/index.html 这本书在网上流传一个中文版本,《编写优化、高效、无错地代码》,另外也有英文影印版《编程精粹》。
http://wangcong.org/blog/?page_id=196 作者王聪,也是相当hard geek,从两个样章看,包含了相当多的内容。
《C语言深度解剖》这本可以在百度文库或google搜到,可以读读,有些参考性。
《C标准和实现》作者姚新颜,他的《深度探索C、C++》算是当年比较有深度的书籍,可惜已经绝版了。这本书也可以在百度文库搜到。这本书也比较值得读。
良葛格C语言学习笔记 http://caterpillar.onlyfun.net/Gossip/CGossip/CGossip.html
C与C++的兼容性问题 http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
另一个文档关于C与C++标准兼容性问题:http://david.tribble.com/text/cdiffs.htm
《C Elements of Style》http://www.oualline.com/books.free/style/index.html
《Linux安全编程》http://www.dwheeler.com/secure-programs/
《C Craft》电子版 http://crypto.stanford.edu/~blynn/c/
《The function pointer tutorials》函数指针教程。http://www.newty.de/fpt/index.html
C语言编程及Unix系统调用,想用C在Unix或者Linux编程的朋友可以参考。http://www.cs.cf.ac.uk/Dave/C/
优化C、C++代码http://www.eventhelix.com/RealtimeMantra/Basics/OptimizingCAndCPPCode.htm
图文并茂介绍C语言的指针 http://boredzo.org/pointers/
另外一篇介绍C语言优化的文章 http://www.prism.uvsq.fr/~cedb/local_copies/lee.html
一个C语言教学ppt http://www.slideshare.net/petdance/just-enough-c-for-open-source-programmers
一些Unix下C语言编程相关的文章 http://users.actcom.co.il/~choo/lupg/tutorials/index.html
Unix下如何建立静态、动态C语言函数库http://users.actcom.co.il/~choo/lupg/tutorials/libraries/unix-c-libraries.html
如何使用GDB http://users.actcom.co.il/~choo/lupg/tutorials/debugging/debugging-with-gdb.html
一些C语言编程技巧 http://users.bestweb.net/~ctips/
Advanced C programming,高级C语言编程,可以提高水平,非常有帮助 http://www.mpi-inf.mpg.de/departments/rg1/teaching/advancedc-ws08/literature.html
C语言问答,这些题目也可用于面试 http://www.gowrikumar.com/c/
漫谈C语言及如何学习C语言--http://my.oschina.net/apeng/blog/137911相关推荐
- 漫谈C语言及如何学习C语言
漫谈C语言及如何学习C语言 云风最近写了一篇博客<C语言的前世今生>.作为长期使用C语言开发网络游戏服务器的程序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C语言在业界使用的 ...
- c语言 字母 八进制表示'/1011',C语言C语言第一课:C语言概述为什么学习C语言怎样学习C语言.DOC...
[摘要]C语言 第一课: C语言概述 为什么学习C语言 怎样学习C语言 参考资料 ----------------------------------------------------------- ...
- 漫谈C语言及如何学习C语言(转)
云风最近写了一篇博客<C语言的前世今生>.作为长期使用C语言开发网络游戏服务器的程序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C语言在业界使用的现状没有怎么描写,有些意犹未 ...
- 如何自学python语言-我是如何学习Python语言?
我喜欢学习新的东西,包括工具,算法,技巧等.一来是帮助我更好地解决问题,二来学习的进程令我愉悦. 我是一位数据工作者,经常会使用到各种软件和工具帮助我解决各种数据问题,比方说数据的抽取与解析,数据的加 ...
- 2019年该学习哪门语言?建议学习C#语言
世界上只有少数几种语言是多功能的,而没有一个像C#那样干净整洁. 作者 | Arctek 译者 | 谭开朗,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: 最直接的答案是: ...
- c语言函数指针学习心得,c语言 函数指针 学习C语言笔记
c语言 函数指针 大一学的C语言,课,算是学了一遍,后来接触Java,C++,易语言,python,还有写单片机用的类似C语言,可以说后来根本没有好好学,C也忘个差不多了,但是这次我课选了OC,不喜欢 ...
- 初识C语言:小白学习C语言的第一周记录
目录 1.个人情况说明于学习期待 2.学习资源的分享 3.学习C语言的准备工作和本周学习的知识 个人情况说明和学习期待 我是一名大学生新人,因为高中时期有幸接触到了机器人比赛,从此深深地热爱上了计算机 ...
- C语言入门教程学习 C语言学习包括哪些?
嵌入式开发有一定了解的朋友们知道是在操作系统内部开发的,对于操作系统内部来说基本上都是用C语言来进行编译的,所以说对于C语言的学习在嵌入式开发过程中是非常重要的.下面就给大家介绍一些C语言入门教程的相 ...
- HTML语言常用英语,学习html语言应该掌握的几组英文单词
原标题:学习html语言应该掌握的几组英文单词 学习html语言应该掌握的几组英文单词 HTML单词 一.标签 1.:boldface 2. :break row 3.:italic [iˈtælik ...
最新文章
- 如何用javasript对Gridview的项目进行汇总统计?
- 使用log4j日志-配置载入问题
- 你敢在post和get上刁难我,就别怪我装逼了
- jquery学习。。
- 【springboot】application.yml配置文件中数据库密码password加密后显示
- java用DFA实现脏词过滤以及用FileAlterationListenerAdaptor实现对资源文件修改的动态监听
- 阿里巴巴内部开发手册
- c语言098十进制输出,C语言题库098.doc
- ArcEngine实现pagelayout中文本元素的属性对话框
- html flash背景透明写法,如何让Flash不遮挡HTML div元素的技巧
- VB6制作一个简单小程序(税收计算)
- 探秘阿里聚石塔技术架构实现(一)
- (P44)面向对象版表达式计算器:符号表SymbolTable的实现
- redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required
- 整理的java基础知识点笔记
- 咖啡再热闹,也逃不出巨头的手掌心
- 十种打领带的方法[转贴]
- Openstack实验笔记
- 云IDE 使用体验,git项目快速启动实践
- 游戏帧同步的流程与实现