C 是一門古老而複雜的語言,絕不是一門可以速成的語言,學習它需要有意識的刻意練習和長時間的持續不斷的磨練。而大多數人不太能耐得住寂寞,喜歡速成,所以像《 21 天學通 C 》這種書就比較受歡迎,賣得很好。通常那些幹了一兩年就說自己熟悉(甚至精通) C 的程式設計師只能算是輕浮的。
Linux 之父 Linus 就曾說:“ C 是一門很恐怖的語言,而比它更恐怖的是很多不合格的程式設計師在使用著它”。
所以,要學習 C 並打算將其作為自己的首選程式語言,就要做好吃十年寒窗苦的準備,要耐得住寂寞,經得起考驗,最終才能舉重若輕,有所成就。
也正因為此,很多人不大願意學習 C ,還會找一些理由,比如 C 沒落了、應用前景不廣泛了作為理由。
其實 C 仍然在不斷髮展,生命力依然旺盛,有大量的行業和不計其數的應用正在源源不斷地引入 C 語言,它的前景依然看好。
接下來我們要討論下列主題:
- C 語言的現狀
- 如何學習 C
C 語言的現狀
2015 年 TIOBE 的程式語言排行榜,C 位列第三。
Stack Overflow 2015 年的開發者調查結果中有一項是“最受歡迎的技術”,C 排名第七,而在最被愛的語言中,C 11 排名第二(僅次於 Swift)。
各種資料表明,C 語言依然廣受歡迎和熱愛。這就是它的現狀。
有機構通過分析與 C 語言相關的招聘資訊得出的結果,使用 C 語言的前三個行業是:金融、銀行和遊戲。接下來是:Front Office、通訊、電子、投行、市場、製造業、零售業。
如果你想成為開發工程師並喜歡上述行業,學習 C 是不錯的選擇。
現在很多人還在使用 C 98(這個標準距今20年了),而 C 標準委員會已經在準備 C 17 。較新的標準 C 11 正在普及,主流的編譯器如 GCC 、 VS 、 Clang 的最新版本也都較為完整的支援了 C 11 ,加上追求卓越的 C 程式設計師主動在產品開發中引入 C 11 , C 的潛能得到了很大的發揮。
如何學習 C 語言
我始終認為要系統學習一門語言,最好是跟著一本書邊學邊練習,快速掌握這門語言的語法和基礎特性,然後就可以找小專案練手,練一練再回頭來看書,往復迴圈,不斷加深理解,慢慢就能掌握到位。
學習 C 語言最好的教程,是 C 之父 Bjarne Stroustrup 親自撰寫的 《The C Programming Language (4th Edition)》,支援 C 11 ,機械工業出版社有英文原版,分兩本,第一本講 1~3 部分, C 語言的基礎內容,第二本是專講第 4 部分, C 標準庫。
另外還有兩本書,也是學習 C 語言的很好選擇,《C Primer Plus(6th Edition)》和《The C Standard Library: A Tutorial and Reference (2nd Edition)》,也都支援 C 11 。
需要注意的是,選擇(設計)練習專案時,最好能結合當前的學習進度,讓自己能夠完成,收穫正向反饋,激勵自己不斷前進。只有持續的正向激勵,才能讓一個人順暢的完成 C 語言的學習。所以,一系列良好的練習專案很重要,既不能難度太低(沒有成就感),也不可難度太高(會有挫敗感),稍稍付出努力就能完成是最理想的。
一旦完成了基礎語言的學習和一系列練習專案,對語言有了一些感知,就可以參與到複雜度較大的專案中來磨練自己。最好是能結合自己的工作與生活,做一些自己感興趣的專案,興趣是最好的老師和最強的動力,如果做的東西感興趣,就很容易鑽進去,學下來。
接下來我們聊聊成為一個能實戰的 C 程式設計師都會經歷的那些事兒:
- IDE 選擇
- C 語言
- 系統呼叫
- 第三方類庫
簡要來說說吧。
IDE 選擇
我比較喜歡的選擇是 Qt Creator(注意下載 Qt SDK 時選擇 mingw 版本,其中自帶 gcc 編譯工具鏈)。而且這個選擇是跨平臺的,也可以在 Linux 、 Mac OS X上使用。
Windows 下還有一個不錯的選擇—— VS 2013或更高版本,對 C 11 支援還算不錯(不如 gcc )。
C 語言的學習
結合 C 的知識圖譜,對 C 語言的學習,建議順序是這樣的:
- 基礎語言
- 類與物件導向
- 輸入輸出
- 字串處理(類庫和正規表示式)
- 容器類庫
- 泛型演算法
- 多執行緒
- 原子操作
大概過一下知識點,具體可以參考知識圖譜。孟巖有一篇名為“快速掌握一個語言最常用的50%”的文章,有很強的參考意義,值得一讀。對於 C 語言來講,快速熟悉1、2、3、4、5這幾部分,就可以動手做一些好玩的小程式了。
- 基礎語言
這部分要了解 C 語言的基本資料型別、比如 int 、 char 、 bool 、 unsigned int 、 long 、 float 、 double 、 、 long long 、 enum 、 union 等等。能理解指標、引用等概念。
掌握基本的程式設計語法,比如表示式、運算子、函式等。關於函式,多說兩句,C 裡有函式物件,在標準庫裡廣泛應用,需要了解;另外 C 11 支援 lambda 表示式(匿名函式),威力強大,建議學習。不過這兩點可以稍往後放放。
主要的語言結構,比如 if-else 、 for 、 switch-case 、 while 、 do-while等。
- 類與物件導向
瞭解 class 的概念,瞭解繼承、虛擬函式、過載、重寫、多型、純虛擬函式、多重繼承等概念,它們是物件導向程式設計在語言層面的基礎。
物件導向更重要的是思想,很多 C 系程式設計師一直都在用類來寫過程式程式。
- 輸入輸出
要做程式設計練習,瞭解基本的輸入輸出操作是必須的。
C 裡輸入輸出分 C 和 C 兩部分。C 風格的 printf 系列函式、 FILE 、 fopen 、 fread 、 fwrite 等等或 C 風格的 istream 、 ostream 、 iostream 、 ifstream 、 ofstream 、 fstream等都可以完成輸入輸出操作 。
- 字串處理
字串處理是我們程式設計時使用頻率最高的,C 裡有 C 風格的字串庫,比如 strcmp 、 strcpy 、 strstr 、 strchr 等函式,也有更為方便和智慧的字串類,如 string 、 wstring 等,看看 API ,練習一下就可以掌握。
C 11 為了更方便字串處理,提供了正規表示式類庫,比如 regex 類,regex_match、regex_search、regex_replace等方法,以及 regex_iterator 這個迭代器類。用起來非常方便,功能也很強大。
- 容器類庫
常見的容器,如 vector 、 list 、 map 、 set 、queue 、 stack 、 deque 、 multimap 、 multiset 等,基本可以滿足日常的開發需要。C 11 引入了定長陣列 array ,具有 C 風格資料的特性,更有 C 的便利操作;還有 unordered_set 、 unordered_map 等新的非排序容器,可以適應不需要排序的場景。
- 泛型程式設計
C 裡的泛型演算法庫,用起來非常方便,比如 find 、 find_if 、 count 、 count_if 、search 、search_n 、 copy 、 copy_n 、 copy_if 、 sort 、 partial_sort 、 binary_search 、 stable_sort 等等,功能非常強大。這些演算法多數基於容器和迭代器,忽略具體資料型別,使用起來稍稍有些難度,不過掌握了容器、模板、迭代器等內容後,就可以很快應用起來。
- 多執行緒和原子操作
這些都是 C 11 引入的類庫,從此以後,C 語言本身有了併發程式設計的能力,非常酷。一個 thread 類,三五行程式碼,就可以啟動一個執行緒,簡單的使用 mutex 和 lock_guard ,就可以完成執行緒間的資源同步與保護,棒極了。
系統呼叫
C 語言本身只能完成獨立於系統的工作,實際的產品往往是與系統緊密相關的,因此必須熟悉系統呼叫。常見的系統呼叫,有 socket ,視窗管理系統(GUI)、檔案操作等等。推薦我認為經典的幾本書,可以幫助我們系統學習。
Windows 下推薦兩本書,《Windows 程式設計》和《Windows 核心程式設計》,應用開發的話,基本有這兩本就夠了。Unix/Linux下也推薦兩本書,《Unix 高階環境程式設計》和《Unix 網路程式設計卷1,套接字》、《Unix網路程式設計卷2,程序間通訊》。前面我們提到 socket ,其實是屬於網路程式設計的一部分,《Unix 網路程式設計》講到的東西,Windows 和 Unix/Linux 都能用。
第三方庫類庫
開始學習一門語言時,造輪子可以讓我們快速進步,然而一旦你入了門,開始做實際的產品開發時,在穩定性、可維護性和交付期的壓力下,就需要合理的利用第三方類庫。
圍繞 C 語言的第三方類庫非常多,簡單列一下,僅供參考。
- GUI:Qt、MFC、WTL、wxWidgets、DirectUI
- 網路:ACE,libevent,libuv,libev, ASIO
- 多媒體與遊戲:Skia、Cairo,SDL,AV3D, OGRE 3D, Cocos2d-x,ffmpeg、OpenH264、VLC、CxImage、CImg
- XML:Xerces-C ,CMarkup,libxml ,TinyXML
- 科學計算:MTL,POOMA, Blitz ,CGAL
學習和使用第三方類庫,又分三個階段(我的訂閱號“程式視界”釋出過一篇名為“兩招讓你成為牛X的T型人才”,裡面有詳細介紹和例項):
- 基礎開發,主要是瞭解API、基於API完成應用
- 熟悉核心及原理,主要是瞭解框架的設計原理,閱讀原始碼,洞悉內在機理
- 優化框架,主要是針對框架的已有功能的不足進行完善、優化,或者使用框架提供的機制擴充套件框架功能,或者對框架進行定製,讓它適合特定情境
有些類庫功能非常豐富,比如 Qt 、 MFC 、 Cocos2d-x 等,單單一個類庫就可以讓人鑽研幾個月到幾年,實際使用時,應當根據實際工作需要,先解決眼前的開發任務,然後設定目標、合理利用時間,沿著上面三個階段來深入學習,培育自己的競爭力。
總結
C 語言是一門複雜的語言,學習難度較高,學習時應當快速掌握基本知識,然後不斷在專案中練習,以點帶面擴充套件學習範圍,閒暇時間有計劃的在深度和廣度兩方面持續學習和積累。一旦形成了這樣的良性迴圈,就可以熟練掌握 C 語言及相關的類庫,不斷精進。
我的訂閱號“程式視界”同步釋出本文,並舉行送書活動,贈送C 之父的《The C Programming Language》一書(兩冊),關注後回覆10185檢視本文可參與活動。
写评论
很抱歉,必須登入網站才能發佈留言。