華文網

學習C語言程式設計基本思路與參考書籍

電腦行業發展非常快,大學裡的教育基本都跟不上實際的社會需求。如果你所在的學校還在指定大家使用譚浩強的教材,或使用VC6.0來教大家上機實驗,那你不妨看看本文,這裡有一些建議可以幫助你不會脫離社會太遠。

考慮到這是一個過來人感覺很基礎,但是對於初學者又覺得困難重重的問題,我想如果這篇文章要想寫得不讓你覺得專業名詞紮堆,內容高深莫測,讀完還是不知所云,那最好的辦法也許是,我們通過溝通的方式把整個「C語言應該怎麼學」的問題由小及大的展開,

慢慢來談。

在開始之前,我們先來做一個小測試。

一、小測試,你準備好學習C語言了嗎?

你是否聽說過二進位數字,他們是如何進行運算的?(基本的數的進制知識)

你能說出一個最小的電腦系統由哪些部分構成嗎?(基本的電腦結構知識)

電腦是如何存儲圖像的? (數位化原理)

上面這三個問題,能回答的同學舉手。如果你舉手了,

那麼我們進入下階段的討論,否則,我將告訴你,你現在最重要的事情,是趕緊找一本《電腦科學導論》把預備知識補充好。

因為——

C語言說到底是一門以記憶體為中心的程式設計語言,你能不能學懂它,其實很大程度上不是取決於你智商高低,而是你是否擁有扎實的電腦結構、存儲、運算原理方面的知識!!

在這裡,我想強調,任何新知識的學習都是有一定的前提條件的。

C語言學習的前提條件就是,對電腦系統要有一個整體的,科學的基礎認識。 脫離了這個基礎認識,一切都很困難。

所以,有些同學學不會C語言,不是因為他們智商不行,而是因為他們沒有準備好。

我花時間寫這篇文章來給大家講C語言的學習,當然是希望大家真正的學會、學懂C語言,並能夠真正感覺到它的用處,所以很抱歉我不會像培訓機構那樣,告訴你“零基礎”就能夠開始學。

但如果你真的按照我說的去做,那麼至少從現在起,你確實是開始有點“學院派”的認真了。

在這篇文章的最後,我推薦了一本我曾經讀過的《電腦科學導論》。這本書可以說是我的啟蒙書,我讀過,真心覺得好,所以推薦給需要的同學。

好了,接下來我們進入C語言的學習過程。

二、學C語言到底學些什麼—— 「語法」和「函式程式庫」

C語言學習的關鍵,是要先搞明白,學C語言到底是在學些什麼?

我這麼一問,有的同學就要翻開課本,指著目錄說,我知道我知道,有變數,資料類型,迴圈語句,函數,哦哦哦,還有指針等等!

很遺憾,如果你以為學習C語言就是學習這些東西,那你得趕緊糾正一下看法,否則接下來的學習會困難重重。因為我曾經就是這麼掉到坑裡的,這種狹隘的觀點讓我浪費了大量的時間去學習瑣碎的細節,又讓我遲遲不能接觸到更重要的知識,結果是眼高手低——知道許多別人不知道的無用知識,但是又寫不出什麼真正像樣的程式來。

所謂「語法」,就是入門教材裡最著重講解的內容。也就是那些所謂的變數、資料類型、分支判斷、迴圈、函數、指標等等。

這些內容比較枯燥,但是好消息是這些內容並不難,都是一些格式化的東西。只要你多練習,就會自動的刻在你的腦子裡,成為一種下意識的習慣。

但是 「語法」本身其實沒什麼用。因為它只是一種格式規範,你學得再好,也不能引導你寫出厲害的程式。因為在軟體設計中,實際上最核心的部分還是在於其 「函式程式庫」部分。

什麼是 「函式程式庫」?

簡單來說,函式程式庫就是別人編寫好的C函數,直接提供給你用,你只要調用裡面的函數,就能實現一定的功能。例如 printf() 函數,你肯定知道,只要調用這個函數,你就能夠在那個黑糊糊的視窗裡顯示一段文字。你並不明白 printf() 的內部工作原理,但是你知道你只要按照說明去調用,就能夠實現對應的功能。

這就是函式程式庫——別人寫好的,打包送到你面前,你可以自由調用來做各種各樣的事情的函數集合。

我來說幾個來自函式程式庫的函數,例如 CreateWindowEx() 函數可以用來創建一個表單(這個函數由微軟提供),例如 GaussianBlur() 函數可以用來對一個圖像進行高斯模糊處理(這個函數由 OpenCV 提供),再比如 evhttp_new() 函數可以創建一個 HTTP 服務程式(這個函數由 libevent 提供)……

其他還有什麼庫函數?太多了。從控制網路通信,到截取視頻畫面並分析其中的人臉位置,到加解密本地檔,甚至包括微信收發消息,抓取淘寶商品資訊……庫函數的數量和有用程度遠遠超乎大家的想像。

誒?你從來沒聽說過還有這些東西?課本裡也沒提到?

那是因為你看的是入門教材,著重講解語法,順帶提到了少量的 C 語言自帶的庫函數而已。事實上 C 語言包含的庫函數本身就有不少,但是更多更強大的還是許多協力廠商庫函數,例如我上面提到的這些。

重點是在於,我想告訴你,庫函數才是你學習C語言並將其應用於實際的關鍵!!

學會調用別人的庫函數,甚至寫出自己的庫函數,都是極其重要的。因為一個函數,本質上就是一個功能單位。你擁有的基礎設施越多,你的發揮空間越大。道理就是這麼簡單。這就是我需要向大家強調的第二個觀點,要想寫出實用的C程式,一大關鍵就是研究並學會使用各種庫函數。

你看見隔壁王二寫了個三維程式能讓一個彩色的立方體在空中旋轉?快找 OpenGL 庫函數來用。什麼?劉大寶寫了個網路軟體能在局域網裡聊天?快找 Socket 庫來用。

看見了嗎?庫函數有多重要?

但是,函式程式庫的學習並不是孤立的。許多庫函數背後需要一定的領域知識支撐。同樣如我第一個觀點所述,需要預備知識。學懂一個函式程式庫,代表的不僅僅是明白如何調用那麼簡單, 而更反映了我們對一個特定領域——網路、數位圖像、密碼學、作業系統等的認識。

三、基本的學習過程與一般規律

如我前面所述,C語言學習主要是以語法入門,然後到函式程式庫。再具體一些來說,包括以下階段:

學習基礎語法

學習簡單的少數幾個C語言自帶的函數

學習一些程式設計的基礎知識(資料結構,演算法)

學習更多更強大的C語言自帶的函數

學習一些特定應用領域的基本理論知識(作業系統,資料庫,網路,圖像……)

應用上一階段學習的到知識進一步學習其他人提供的函式程式庫(網路處理、作業系統管理、圖像、密碼學等等)

對於本科階段的同學來說,著重學好1-4,有選擇的學習一下5-6,做一些小作品出來,就已經非常非常不錯了。這就是一般的學習規律。說得很簡短,但是要做到真的很不容易。

四、參考書籍

首先第一本,也是我認為最重要的書,是這本《電腦科學導論》。亞馬遜地址:《電腦科學導論(原書第2版)》 佛羅贊 (Behrouz A.Forouzan), 莫沙拉夫 (Firouz Mosharraf), 劉藝【摘要 書評 試讀】圖書

可以說,這本書是對我人生影響最大的兩本書之一。這本書通俗易懂,知識面廣,但又具有一定的深度。真是因為讀了這本書,才讓我建立了對電腦科學合理的基本認識。在不涉及太多的數學原理的情況下,這本書清晰的揭示了包括電腦的基本構成,CPU運算的原理,記憶體、硬碟、光碟是如何存儲資料的,程式設計的基本原理(機器語言、組合語言,結構化程式設計語言,物件導向程式設計語言),以及網路、資料壓縮等。

說白了,就是一本科普書。但是是一本偉大的科普書。入門者的福音書。

然後,第二本,就是關於C語言語法的書籍了,說實話這部份我已經沒有印象看的什麼書了。因為我這個人有個毛病,就是喜歡東翻翻,西翻翻,哪裡不懂就到處找書。可見這個部分其實沒有大家想像的那麼固定,你只要找到一本自己看得懂的書,就是好書!不必太過於拘泥於書與書之間的優劣比較。

最經典的C語言入門書籍許多人肯定要說是 K&R 的那本。但是其實這本書對大多數初學者來說還是略難,如果有興趣也可以讀一讀。但我更建議你瞭解一些C語言之後再轉過來看看會更好。

柴田望洋的《明解C語言》最近是一本廣受歡迎的親切的C語言入門書。《明解C語言》 柴田望洋, 管傑, 羅勇【摘要 書評 試讀】圖書

昨天我專門到書店翻了一下,這本書確實很不錯,親切,謙虛,易懂。但我想也未必適合所有人。如果你是希望學習曲線平緩一些的,可以考慮看看。

啊,差點忘了,還有一本咱們國內的趙岩先生寫的《C語言點滴》也有不錯的反響,也許大家也可以找來看看。《C語言點滴》 趙岩【摘要 書評 試讀】圖書

基本上,上面這些書就能幫助你比較輕鬆的入門了。其他書籍推薦,我會陸續也寫出來。今天實在寫不了這麼多了。

但是,再補充一本,如果對於那些已經學得差不多的同學,必須得看看下面這本,這是我的至愛之一啊!^_^ 那就是吊炸天的《C Standard Library》,china-pub連結:C標準庫(C標準庫“聖經”)[按需印刷]

好好看看這本書,它是真正的頂級教材,因為——裡面包含了標準庫實現的完整源碼,以及作者在實現時的思路講解。是一本值得收藏的超級力作。讓我們一睹頂級程式師的思維傑作。(吐嘈:這本書的翻譯還是有一些值得修正的地方,所以能收英文版的同學就直接收英文版了)

C語言是面向過程的,而C++是物件導向的

C和C++的區別:

C是一個結構化語言,它的重點在於演算法和資料結構。C程式的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。

C++,首要考慮的是如何構造一個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取物件的狀態資訊得到輸出或實現過程(事務)控制。 所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”。

C與C++的最大區別:在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”,而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程式設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,“C加上好的設計”也能寫出非常好的東西。

這幾本書其實並未涵蓋C語言學習的所有重要方面。稍後我會再放上一些來。今天打字打到手疼,就不繼續了。

五、晉級——通向更高境界之路

學無止境。更專業的學習至此其實才剛剛開始。

結果是眼高手低——知道許多別人不知道的無用知識,但是又寫不出什麼真正像樣的程式來。

所謂「語法」,就是入門教材裡最著重講解的內容。也就是那些所謂的變數、資料類型、分支判斷、迴圈、函數、指標等等。

這些內容比較枯燥,但是好消息是這些內容並不難,都是一些格式化的東西。只要你多練習,就會自動的刻在你的腦子裡,成為一種下意識的習慣。

但是 「語法」本身其實沒什麼用。因為它只是一種格式規範,你學得再好,也不能引導你寫出厲害的程式。因為在軟體設計中,實際上最核心的部分還是在於其 「函式程式庫」部分。

什麼是 「函式程式庫」?

簡單來說,函式程式庫就是別人編寫好的C函數,直接提供給你用,你只要調用裡面的函數,就能實現一定的功能。例如 printf() 函數,你肯定知道,只要調用這個函數,你就能夠在那個黑糊糊的視窗裡顯示一段文字。你並不明白 printf() 的內部工作原理,但是你知道你只要按照說明去調用,就能夠實現對應的功能。

這就是函式程式庫——別人寫好的,打包送到你面前,你可以自由調用來做各種各樣的事情的函數集合。

我來說幾個來自函式程式庫的函數,例如 CreateWindowEx() 函數可以用來創建一個表單(這個函數由微軟提供),例如 GaussianBlur() 函數可以用來對一個圖像進行高斯模糊處理(這個函數由 OpenCV 提供),再比如 evhttp_new() 函數可以創建一個 HTTP 服務程式(這個函數由 libevent 提供)……

其他還有什麼庫函數?太多了。從控制網路通信,到截取視頻畫面並分析其中的人臉位置,到加解密本地檔,甚至包括微信收發消息,抓取淘寶商品資訊……庫函數的數量和有用程度遠遠超乎大家的想像。

誒?你從來沒聽說過還有這些東西?課本裡也沒提到?

那是因為你看的是入門教材,著重講解語法,順帶提到了少量的 C 語言自帶的庫函數而已。事實上 C 語言包含的庫函數本身就有不少,但是更多更強大的還是許多協力廠商庫函數,例如我上面提到的這些。

重點是在於,我想告訴你,庫函數才是你學習C語言並將其應用於實際的關鍵!!

學會調用別人的庫函數,甚至寫出自己的庫函數,都是極其重要的。因為一個函數,本質上就是一個功能單位。你擁有的基礎設施越多,你的發揮空間越大。道理就是這麼簡單。這就是我需要向大家強調的第二個觀點,要想寫出實用的C程式,一大關鍵就是研究並學會使用各種庫函數。

你看見隔壁王二寫了個三維程式能讓一個彩色的立方體在空中旋轉?快找 OpenGL 庫函數來用。什麼?劉大寶寫了個網路軟體能在局域網裡聊天?快找 Socket 庫來用。

看見了嗎?庫函數有多重要?

但是,函式程式庫的學習並不是孤立的。許多庫函數背後需要一定的領域知識支撐。同樣如我第一個觀點所述,需要預備知識。學懂一個函式程式庫,代表的不僅僅是明白如何調用那麼簡單, 而更反映了我們對一個特定領域——網路、數位圖像、密碼學、作業系統等的認識。

三、基本的學習過程與一般規律

如我前面所述,C語言學習主要是以語法入門,然後到函式程式庫。再具體一些來說,包括以下階段:

學習基礎語法

學習簡單的少數幾個C語言自帶的函數

學習一些程式設計的基礎知識(資料結構,演算法)

學習更多更強大的C語言自帶的函數

學習一些特定應用領域的基本理論知識(作業系統,資料庫,網路,圖像……)

應用上一階段學習的到知識進一步學習其他人提供的函式程式庫(網路處理、作業系統管理、圖像、密碼學等等)

對於本科階段的同學來說,著重學好1-4,有選擇的學習一下5-6,做一些小作品出來,就已經非常非常不錯了。這就是一般的學習規律。說得很簡短,但是要做到真的很不容易。

四、參考書籍

首先第一本,也是我認為最重要的書,是這本《電腦科學導論》。亞馬遜地址:《電腦科學導論(原書第2版)》 佛羅贊 (Behrouz A.Forouzan), 莫沙拉夫 (Firouz Mosharraf), 劉藝【摘要 書評 試讀】圖書

可以說,這本書是對我人生影響最大的兩本書之一。這本書通俗易懂,知識面廣,但又具有一定的深度。真是因為讀了這本書,才讓我建立了對電腦科學合理的基本認識。在不涉及太多的數學原理的情況下,這本書清晰的揭示了包括電腦的基本構成,CPU運算的原理,記憶體、硬碟、光碟是如何存儲資料的,程式設計的基本原理(機器語言、組合語言,結構化程式設計語言,物件導向程式設計語言),以及網路、資料壓縮等。

說白了,就是一本科普書。但是是一本偉大的科普書。入門者的福音書。

然後,第二本,就是關於C語言語法的書籍了,說實話這部份我已經沒有印象看的什麼書了。因為我這個人有個毛病,就是喜歡東翻翻,西翻翻,哪裡不懂就到處找書。可見這個部分其實沒有大家想像的那麼固定,你只要找到一本自己看得懂的書,就是好書!不必太過於拘泥於書與書之間的優劣比較。

最經典的C語言入門書籍許多人肯定要說是 K&R 的那本。但是其實這本書對大多數初學者來說還是略難,如果有興趣也可以讀一讀。但我更建議你瞭解一些C語言之後再轉過來看看會更好。

柴田望洋的《明解C語言》最近是一本廣受歡迎的親切的C語言入門書。《明解C語言》 柴田望洋, 管傑, 羅勇【摘要 書評 試讀】圖書

昨天我專門到書店翻了一下,這本書確實很不錯,親切,謙虛,易懂。但我想也未必適合所有人。如果你是希望學習曲線平緩一些的,可以考慮看看。

啊,差點忘了,還有一本咱們國內的趙岩先生寫的《C語言點滴》也有不錯的反響,也許大家也可以找來看看。《C語言點滴》 趙岩【摘要 書評 試讀】圖書

基本上,上面這些書就能幫助你比較輕鬆的入門了。其他書籍推薦,我會陸續也寫出來。今天實在寫不了這麼多了。

但是,再補充一本,如果對於那些已經學得差不多的同學,必須得看看下面這本,這是我的至愛之一啊!^_^ 那就是吊炸天的《C Standard Library》,china-pub連結:C標準庫(C標準庫“聖經”)[按需印刷]

好好看看這本書,它是真正的頂級教材,因為——裡面包含了標準庫實現的完整源碼,以及作者在實現時的思路講解。是一本值得收藏的超級力作。讓我們一睹頂級程式師的思維傑作。(吐嘈:這本書的翻譯還是有一些值得修正的地方,所以能收英文版的同學就直接收英文版了)

C語言是面向過程的,而C++是物件導向的

C和C++的區別:

C是一個結構化語言,它的重點在於演算法和資料結構。C程式的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。

C++,首要考慮的是如何構造一個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取物件的狀態資訊得到輸出或實現過程(事務)控制。 所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”。

C與C++的最大區別:在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”,而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程式設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,“C加上好的設計”也能寫出非常好的東西。

這幾本書其實並未涵蓋C語言學習的所有重要方面。稍後我會再放上一些來。今天打字打到手疼,就不繼續了。

五、晉級——通向更高境界之路

學無止境。更專業的學習至此其實才剛剛開始。