思路不對努力白費!0基礎學好C語言程式設計,必須掌握的學習思路!
計算機行業發展非常快,大學裡的教育基本都跟不上實際的社會需求。如果你所在的學校還在指定大家使用譚浩強的教材,或使用VC6.0來教大家上機實驗,那你不妨看看本文,這裡有一些建議可以幫助你不會脫離社會太遠。
考慮到這是一個過來人感覺很基礎,但是對於初學者又覺得困難重重的問題,我想如果這篇文章要想寫得不讓你覺得專業名詞扎堆,內容高深莫測,讀完還是不知所云,那最好的辦法也許是,我們通過溝通的方式把整個「C語言應該怎麼學」的問題由小及大的展開,慢慢來談。
在開始之前,我們先來做一個小測試。
一、小測試,你準備好學習C語言了嗎?
-
你是否聽說過二進位制數,他們是如何進行運算的?(基本的數的進位制知識)
-
你能說出一個最小的計算機系統由哪些部分構成嗎?(基本的計算機結構知識)
-
計算機是如何儲存影象的? (數字化原理)
上面這三個問題,能回答的同學舉手。如果你舉手了,那麼我們進入下階段的討論,否則,我將告訴你,你現在最重要的事情,是趕緊找一本《電腦科學導論》把預備知識補充好。
因為——
C語言說到底是一門以記憶體為中心的程式語言,你能不能學懂它,其實很大程度上不是取決於你智商高低,而是你是否擁有紮實的計算機結構、儲存、運算原理方面的知識!!
在這裡,我想強調,任何新知識的學習都是有一定的前提條件的。C語言學習的前提條件就是,對計算機系統要有一個整體的,科學的基礎認識。 脫離了這個基礎認識,一切都很困難。
所以,有些同學學不會C語言,不是因為他們智商不行,而是因為他們沒有準備好。
我花時間寫這篇文章來給大家講C語言的學習,當然是希望大家真正的學會、學懂C語言,並能夠真正感覺到它的用處,所以很抱歉我不會像培訓機構那樣,告訴你“零基礎”就能夠開始學。但如果你真的按照我說的去做,那麼至少從現在起,你確實是開始有點“學院派”的認真了。
在這篇文章的最後,我推薦了一本我曾經讀過的《電腦科學導論》。這本書可以說是我的啟蒙書,我讀過,真心覺得好,所以推薦給需要的同學。
好了,接下來我們進入C語言的學習過程。
二、學C語言到底學些什麼—— 「語法」和「函式庫」
C語言學習的關鍵,是要先搞明白,學C語言到底是在學些什麼?
我這麼一問,有的同學就要翻開課本,指著目錄說,我知道我知道,有變數,資料型別,迴圈語句,函式,哦哦哦,還有指標等等!
很遺憾,如果你以為學習C語言就是學習這些東西,那你得趕緊糾正一下看法,否則接下來的學習會困難重重。因為我曾經就是這麼掉到坑裡的,這種狹隘的觀點讓我浪費了大量的時間去學習瑣碎的細節,又讓我遲遲不能接觸到更重要的知識,結果是眼高手低——知道許多別人不知道的無用知識,但是又寫不出什麼真正像樣的程式來。
所謂「語法」,就是入門教材裡最著重講解的內容。也就是那些所謂的變數、資料型別、分支判斷、迴圈、函式、指標等等。
這些內容比較枯燥,但是好訊息是這些內容並不難,都是一些格式化的東西。只要你多練習,就會自動的刻在你的腦子裡,成為一種下意識的習慣。
但是 「語法」本身其實沒什麼用。因為它只是一種格式規範,你學得再好,也不能引導你寫出厲害的程式。因為在軟體設計中,實際上最核心的部分還是在於其 「函式庫」部分。
關於怎麼快速學C/C++遊戲程式設計,有什麼方法,這個問題,想必大家都已經心中有數了,打算深入瞭解這個行業的朋友,可以加下小編上面的C/C++遊戲程式設計學習裙【 玖四捌,玖伍四,四捌四】,不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,包括小編自己整理的一份2018最新的C/C++資料和0基礎入門教程,歡迎初學和進階中的小夥伴。
什麼是 「函式庫」?
簡單來說,函式庫就是別人編寫好的C函式,直接提供給你用,你只要呼叫裡面的函式,就能實現一定的功能。例如 printf() 函式,你肯定知道,只要呼叫這個函式,你就能夠在那個黑糊糊的窗口裡顯示一段文字。你並不明白 printf() 的內部工作原理,但是你知道你只要按照說明去呼叫,就能夠實現對應的功能。
這就是函式庫——別人寫好的,打包送到你面前,你可以自由呼叫來做各種各樣的事情的函式集合。
我來說幾個來自函式庫的函式,例如 CreateWindowEx() 函式可以用來建立一個窗體(這個函式由微軟提供),例如 GaussianBlur() 函式可以用來對一個影象進行高斯模糊處理(這個函式由 OpenCV 提供),再比如 e連結 函式可以建立一個 HTTP 服務程式(這個函式由 libevent 提供)……
其他還有什麼庫函式?太多了。從控制網路通訊,到擷取視訊畫面並分析其中的人臉位置,到加解密本地檔案,甚至包括微信收發訊息,抓取淘寶商品資訊……庫函式的數量和有用程度遠遠超乎大家的想象。
誒?你從來沒聽說過還有這些東西?課本里也沒提到?
那是因為你看的是入門教材,著重講解語法,順帶提到了少量的 C 語言自帶的庫函式而已。事實上 C 語言包含的庫函式本身就有不少,但是更多更強大的還是許多第三方庫函式,例如我上面提到的這些。
重點是在於,我想告訴你,庫函式才是你學習C語言並將其應用於實際的關鍵!!
學會呼叫別人的庫函式,甚至寫出自己的庫函式,都是極其重要的。因為一個函式,本質上就是一個功能單位。你擁有的基礎設施越多,你的發揮空間越大。道理就是這麼簡單。這就是我需要向大家強調的第二個觀點,要想寫出實用的C程式,一大關鍵就是研究並學會使用各種庫函式。
你看見隔壁王二寫了個三維程式能讓一個彩色的立方體在空中旋轉?快找 OpenGL 庫函式來用。什麼?劉大寶寫了個網路軟體能在局域網裡聊天?快找 Socket 庫來用。
看見了嗎?庫函式有多重要?
但是,函式庫的學習並不是孤立的。許多庫函式背後需要一定的領域知識支撐。同樣如我第一個觀點所述,需要預備知識。學懂一個函式庫,代表的不僅僅是明白如何呼叫那麼簡單, 而更反映了我們對一個特定領域——網路、數字影象、密碼學、作業系統等的認識。
三、基本的學習過程與一般規律
如我前面所述,C語言學習主要是以語法入門,然後到函式庫。再具體一些來說,包括以下階段:
-
學習基礎語法
-
學習簡單的少數幾個C語言自帶的函式
-
學習一些程式設計的基礎知識(資料結構,演算法)
-
學習更多更強大的C語言自帶的函式
-
學習一些特定應用領域的基本理論知識(作業系統,資料庫,網路,影象……)
-
應用上一階段學習的到知識進一步學習其他人提供的函式庫(網路處理、作業系統管理、影象、密碼學等等)
對於本科階段的同學來說,著重學好1-4,有選擇的學習一下5-6,做一些小作品出來,就已經非常非常不錯了。這就是一般的學習規律。說得很簡短,但是要做到真的很不容易。
四、書籍推薦
基礎(C語言入門,初學,程式設計基礎)
-
《C語言程式設計:現代方法》(第2版)(C Programming: A Modern Approach, 2nd Edition, K.N.King)
-
《深入理解計算機系統》(修訂版或第2版)(Computer Systems: A Programmer’s Perspective, Randal E. Bryant et al),閱讀建議
-
《C語言程式設計》(第2版)(The C Programming Language, Brian W. Kernighan & Dennis M. Ritchie)
-
《程式設計師修煉之道》(The Pragmatic Programmer: From Journeyman to master, Andy Hunt & Dave Thomas)
核心/驅動
-
《Linux核心設計與實現》(第3版)(Linux Kernel Development, 3rd Edition, Robert Love)
-
《Linux裝置驅動程式》(第3版)(Linux Device Driver, 3rd Edition, Jonathan Corbet et al)
-
《深入Linux核心架構》(Professional Linux Kernel Architecture, Wolfgang Mauerer)
應用
-
《UNIX環境高階程式設計》(Advanced Programming in the UNIX Environment, W. Richard Stevens)
-
《UNIX網路程式設計》(Unix Network Programming, W. Richard Stevens)
進階
-
《C陷阱與缺陷》(C Traps and Pitfalls, Andrew Koenig)
-
《C專家程式設計》(Expert C Programming, Peter van der Linden)
-
《ARM嵌入式系統開發:軟體設計與優化》(ARM System Developer’s Guide: Designing and Optimizing System Software, Andrew Sloss et al)
你們在學習困難中遇到的問題是什麼呢?歡迎提問,抽空給大家解答!