c語言資源

雲風最近寫了一篇博客《C語言的前世此生 》。做爲長期使用C語言開發網絡遊戲服務器的程序員,雲風是有理由寫這樣一篇文字,不過仍是感受談的不夠深刻,C語言在業界使用的現狀沒有怎麼描寫,有些意猶未盡。html

在這裏想比較系統的談談我的對C語言學習方式方法的理解。分別按照書籍、實驗環境搭建、網絡資源來分別介紹,但願能寫的比較完整全面一些,給想學習C語言的朋友一個有價值的參考。前端

爲何要學習C語言? 
爲何要學習、使用C語言?爲何要學習一個可能比本身都歲數大的編程語言?linux

我在前面如何學習編程語言的博客文章http://sunxiunan.com/?p=1597 裏提到,選擇一門編程語言,「爲何而學」這個目的是最重要的,目的不明確就無法學好。這也是爲何不少學生朋友在大學裏必修C語言卻以爲沒學明白的緣由。由於學習的目的不明確,學習固然也沒有動力。還有一個緣由是C語言是工程實踐性很強的語言,它不是來自某個研究所某個大學學院,而是實實在在從項目須要中產生,伴隨着Unix的興起而流行,語義簡明清晰,功能強大而不臃腫,簡潔而又不過度簡單,實在是居家旅行工做學習必備之良友。git

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語言做爲主要編程工做語言。github

Java語言有一個口號:「一次編寫,到處運行」,就是跨平臺這個噱頭。實際上C語言從早期開始就幾乎達到了「一次編寫,到處編譯」,在ANSI在1989年統一了C語言標準之後(稱之爲C89),只要特定平臺上的編譯器完整實現了C89標準,並且你的代碼沒有使用某些特殊的擴展(GCC以及微軟都有本身的編譯器特定擴展),那麼代碼必定能夠編譯經過,再實現一下操做系統相關的函數庫,C語言的移植就是很簡單的事情。能夠用Lua做爲例子,Lua自己是徹底遵循C89標準,沒有使用任何特定擴展,這也保證了有C語言編譯器的平臺,均可以編譯使用Lua。能夠編譯運行C語言的硬件平臺能夠從A排到Z,真是很是有意思的事情。web

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語言,只須要買這一本就夠了。若是你經費足夠,建議你多買幾本,辦公室、家裏都放上一本,隨手均可以翻翻。用三個詞語來形容它就是:經典!經典!經典!這本薄薄的只有二百多頁的小書涵蓋了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語言,必定不能只讀書,應該動手練習完成書裏面的項目需求(好比編寫一個目錄瀏覽器)以及每章的練習題目。這就須要有能夠實驗的環境,下面針對不一樣操做系統簡單作一下介紹。

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操做系統相關的界面應用程序或者服務類程序。而VC++Express自帶了這些頭文件以及編程庫,雖然功能稍微簡陋,但對於練習使用基本夠用。

主頁: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、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語言,一加一發揮出來的力量不只僅是二,而是很是二(說笑一下,哈哈)。

還有什麼問題,歡迎留言。

附錄 
一些有用的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.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.splint.org/

http://valgrind.org/

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

cert這個文檔國內有中文翻譯版本:https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard

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

相關文章
相關標籤/搜索