专业网站制作企业,建设网站硬件需要,怎么样更好的做网站,给个高质量的网站云风最近写了一篇博客《C语言的前世今生》。作为长期使用C语言开发网络游戏服务器的程序员#xff0c;云风是有理由写这样一篇文字#xff0c;不过还是感觉谈的不够深入#xff0c;C语言在业界使用的现状没有怎么描写#xff0c;有些意犹未尽。在这里想比较系统的谈谈个人对…云风最近写了一篇博客《C语言的前世今生》。作为长期使用C语言开发网络游戏服务器的程序员云风是有理由写这样一篇文字不过还是感觉谈的不够深入C语言在业界使用的现状没有怎么描写有些意犹未尽。在这里想比较系统的谈谈个人对C语言学习方式方法的理解。分别按照书籍、实验环境搭建、网络资源来分别介绍希望能写的比较完整全面一些给想学习C语言的朋友一个有价值的参考。为什么要学习C语言为什么要学习、使用C语言为什么要学习一个可能比自己都岁数大的编程语言我在前面如何学习编程语言的博客文章http://sunxiunan.com/?p1597 里提到选择一门编程语言“为什么而学”这个目的是最重要的目的不明确就没法学好。这也是为什么很多学生朋友在大学里必修C语言却觉得没学明白的原因。因为学习的目的不明确学习当然也没有动力。还有一个原因是C语言是工程实践性很强的语言它不是来自某个研究所某个大学学院而是实实在在从项目需要中产生伴随着Unix的兴起而流行语义简明清晰功能强大而不臃肿简洁而又不过分简单实在是居家旅行工作学习必备之良友。C语言相比C的优点之一就是最小惊讶原则一是一二是二不会在私底下产生一些莫名其妙的额外产物。用C做个例子比如这样一个函数原型void PassWithClassValue(COneClass clsParam1)稍微了解C的朋友都会知道如果你没有实现COneClass的拷贝构造函数编译器会好心的帮你实现一个而且在调用这个函数PassWithClassValue的时候偷偷地调用拷贝构造函数产生一个临时对象作为参数传递对于某些情况比如编写操作系统这类必须优化性能的情景下这些自以为是的东西是非常邪恶的事情。C语言本身只提供必要的语言特性其它复杂一点功能如文件处理、数学计算等等都以库函数方式提供甚至连malloc、free这种“必须有”的功能也是以标准库函数的方式提供而不是作为C语言核心出现。在伟大的著名的无所不包的《KR》开头部分就提到了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/?p1597 曾经提到过一个比较系统学习一门新的编程语言的方式C语言学习也可以按照类似的顺序阅读参考书阅读代码编写调试实际程序上网参与讨论研究高级话题。学习语言的开始一般是阅读参考书。我建议选择几本非常经典的好书仔细完整反复阅读几遍“书读百遍其义自现”。选择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》后面称为 KR里面包含了一个简单的语法解析器包含了malloc如何实现包含了一个完整的操作系统目录浏览程序这些程序的实用性极高可以这样说如果学习任何一门语言能够自己独立动手实现以上的功能基本上就可以算是入门了。KR书里面每段都蕴含着非常值得探究的软件开发工程实践经验如果没有一定的开发经验其实是看不出来这些冰山下面的内容的比如开头一章就提出用写完整代码这种方式来教学而在书中那些C语言的陷阱或者可能出问题的地方都有提到但是由于篇幅所限写的非常简约很难让人一下就看懂。我正在完整的逐字逐句的阅读此书希望能稍作注解写几篇博客分享一下。《C程序设计语言第2版·新版》http://book.douban.com/subject/1139336/这是KR的中文译本可以先从中文译本看起然后再读一遍英文原版既可以学习英文又可以体会原文那种简约优美的风格。《C陷阱与缺陷》http://book.douban.com/subject/2778632/《C专家编程》http://book.douban.com/subject/2377310/这两本书也是学习及使用C语言的朋友必备的两本书比如《C专家编程》专门用两三个章节详细介绍C语言中数组与指针的不同之处这两本书在某种程度上算是对KR略过的地方做了详细补充强烈推荐。《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语言一定不能只读书应该动手练习完成书里面的项目需求比如编写一个目录浏览器以及每章的练习题目。这就需要有可以实验的环境下面针对不同操作系统简单做一下介绍。2动手实验环境搭建也没有调查过不知道现在学校里学习C语言是不是依然跟着谭浩强老师用TurboC2.0编程如果还是这个组合的话那就太差劲了赶快抛开它们。下面主要介绍不同操作系统平台下的集成编程环境基于初学者以及我个人喜好就不推荐大家命令行下用vim编程了直接上IDE。Windows系统下推荐大家使用Code::blocks这个软件。这个软件最大优点是自带了基于mingw的GCC以及GDB只要下载70M左右软件包就可以完整支持C、C语言编程了。各种功能比如调试功能也很强大版本更新也比较快。注意下载选择名字有mingw的文件比如最新版本是codeblocks-10.05mingw-setup.exe版本也许有所不同。主页http://www.codeblocks.org/如果需要做Windows操作系统的开发可以下载Visual C 2010 Express。因为Code::Blocks不包含Windows编程头文件实际是因为没有Windows SDK无法编写Windows操作系统相关的界面应用程序或者服务类程序。而VCExpress自带了这些头文件以及编程库虽然功能稍微简陋但对于练习使用基本够用。主页http://www.microsoft.com/express/windows/对于计算机专业的学生朋友建议大家使用Linux操作系统或者更详细一点是使用Xubuntu操作系统作为桌面使用Netbeans和GCC这个组合当然也可以选择Code::Blocks。在Xubuntu下可以通过apt-get install build-essential这个命令安装gcc相关程序已经可以在Terminal下编译C语言程序了但为了使用方便大家可以选择Netbeans的C支持包在Netbeans网站上就能下载。主页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语言1972年由Dennis Ritchie设计的命令式、结构化范式编程语言。类型为静态的弱类型需要显式定义。最新国际标准为C99。设计上主要受到了B、ALGOL68、汇编语言、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语言相关的免费辅助开发软件非常丰富比如splintvalgrind不少核心库经过长期使用也都非常稳定。由于C语言广泛支持各种平台以及编译器相对成熟可靠不少编程语言选择C语言作为一个中间层比如Glasgow Haskell编译器就是这样做的。另一个可以找到大量C语言编程相关资料的地方是“美味书签”通过搜索特定关键字 C programming就可以找到很多值得挖掘的资源http://delicious.com/search?pcprogramming还可以参考dmoz.org的C语言分类http://www.dmoz.org/Computers/Programming/Languages/C/ 相比美味书签时效性能差点但是分类比较系统查找也要容易一些。程序员往往是懒惰的“拿来主义”、“拷贝主义”很流行也很有效当对某个函数或者关键字不是很理解的时候看看别人是怎么使用的会非常有启发性。这里介绍几个常用的代码搜索网站最常用的是google的codesearchhttp://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语言一加一发挥出来的力量不仅仅是二而是非常二说笑一下哈哈。还有什么问题欢迎留言。附录一些有用的C语言网络资源C语言标准化组织ISO JTC1/SC22/WG14的主页在这里可以找到ISO C的文档http://www.open-std.org/jtc1/sc22/wg14/《The Development of the C Language》作者Dennis Ritchie极为经典的论文。 http://cm.bell-labs.com/cm/cs/who/dmr/chist.html“C语言全景”这个网站内容很全面http://www.softpanorama.org/Lang/c.shtmlDan 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.chttp://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_LibraryGlib是GTK的底层辅助编程库与C标准库是不一样的在C语言上实现了面向对象机制http://en.wikipedia.org/wiki/GLibdietlibc在前面博客文章介绍过C标准库的另一种实现http://www.fefe.de/dietlibc/一些C语言编程时可以使用的工具软件帮你提高代码质量http://www.splint.org/http://valgrind.org/http://www.dwheeler.com/flawfinder/PMD可用于检测重复代码 http://pmd.sourceforge.net/cpd.htmlllvm的静态分析项目 http://clang-analyzer.llvm.org/C语言编程规范编程标准http://en.wikipedia.org/wiki/MISRA_Chttp://www.eecs.harvard.edu/~ellard/CS50-96/programming-style.htmlhttp://developers.sun.com/solaris/articles/secure.htmlcert这个文档国内有中文翻译版本https://www.securecoding.cert.org/confluence/display/seccode/CERTCSecureCodingStandardhttp://www.cs.utah.edu/dept/old/texinfo/standards/standards_toc.htmlC语言编程电子书及教程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_id196 作者王聪也是相当hard geek从两个样章看包含了相当多的内容。《C语言深度解剖》这本可以在百度文库或google搜到可以读读有些参考性。《C标准和实现》作者姚新颜他的《深度探索C、C》算是当年比较有深度的书籍可惜已经绝版了。这本书也可以在百度文库搜到。这本书也比较值得读。良葛格C语言学习笔记 http://caterpillar.onlyfun.net/Gossip/CGossip/CGossip.htmlC与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.htmlC语言编程及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.htmlUnix下如何建立静态、动态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.htmlC语言问答这些题目也可用于面试 http://www.gowrikumar.com/c/