C語言學習方法分享-信盈達
時間:2018-12-19 00:00:00
來源:信盈達
作者:信盈達
前言:兩個原因促使我寫下這篇文章,第一就是作為過來人根據我自己的經驗我知道編程的初學者一般都很興奮也都有種困惑,一方面對運行在計算機(注:不特別指明都指個人微型計算機)的五花八門如精彩的游戲程序,多姿多彩的網站等等漂亮的視窗程序所著迷,另一方面大部分的初學者(如計算機專業(yè)的低年級學生)都是從簡單命令行程序“Hello world!”開始入手而且很長一段時間都無法接觸到日常經常使用的視窗程序,由此好奇者有之,迷惑者有之等等,更遺憾的是也有少部分人因為困惑對編程逐漸失去興趣。第二就是今天妹妹看C程序設計語言(潭浩強的那本,相信大部分學過C語言的人都聽過)碰到一個例題沒有看懂,而作為計算機專業(yè)畢業(yè)的老哥自然義不容辭地承擔起了講解的任務,在噼里啪啦的大說之后,老妹終于弄懂了例題程序的意思,但仍然不過癮,竟然問起我如何學好C語言,弄得我心一驚,這里我還是有點自知之明的,因為我知道我并不是什么大師,甚至自己對計算機世界也經常是一片茫然,不過看著她那“崇拜”的眼神,不說點什么似乎有點不大好,只好硬著頭皮把自己以前的一些理解講了一番。所以既然知道有這個需要,盡管自己見識淺薄,也抱著“區(qū)區(qū)陋見假如能夠對后學者能夠有所幫助那是再好不過了,即使有所偏頗當當笑話看看能有助于大家飯后生活也是美德一件”的心情就寫下了這篇文章。
我是很樂意將計算機(程序設計)語言跟人類語言做類比的,在我看來學習程序設計語言就象學習外語一樣,通過計算機語言與計算機交流就如同在使用外語與老外交流一樣。通常學習語言比如英語有單詞,語法,語義三個部分組成,單詞是構成語言的最基本的要素,語法告訴我們單詞如何構成語句,語義則告訴我們單詞構成的語句的意思,類似的程序設計語言中也是有[1] “單詞”,“語法”,“語義”三部分組成,其中跟人類語言一樣,“單詞”“語法”是基礎,而為達到交流的目的“語義”是整個程序設計語言的重點。當然相對人類語言(以英語為例)而程序設計語言(以C語言為例)顯然要簡單得多,所以這里我們要首先確立自己對學好程序設計語言的信心。下面試著加以說明,其中可能有些類比不太適當,不過好象也差不多吧,你自己也可以試著舉出更好的例子以使自己更容易明白,我這里就拋磚引玉吧。
先從“單詞”談起,在英語中就是由26個英文字母以及26個英文字母構成的單詞組成,學習語言我們首先應該記憶的就是“單詞”,26個英文字母A,B,C,……然后就是令人頭痛的英文單詞,記憶的過程是痛苦的至少我學英語時最惱火的地方就是反復記憶老是忘記的單詞,類似的在C語言中我們可以作這樣的類比,C語言的單詞是由26個英文字母、數字(0,1,2……9)、運算符以及其他特殊符號組成,所以相比而言學習C語言是多么的幸福。
“語法”,在英語中是如常見構詞法、時態(tài)、常用句型、特殊用法、固定用法等等(呵呵,不是語言專家如有興趣可以參考英語語法書籍),僅拿構詞法來說動詞后面加er就變成名詞(work-worker),名詞后面加y就變成形容詞(wind-windy)等十多種變換還要記憶些特殊變換,復雜且繁瑣,假如算上時態(tài)、句型等那就更復雜了。在C語言中也同樣也存在有語法,比如標識符、常量、表達式、數據定義、函數定義、變量初始化、語句構成、預處理命令等大致8種語法,如標識符[2]可由字母、數字以及下劃線組成,且必須以字母或下劃線開頭,區(qū)分大小寫,另外在不同的編譯器中字符數目有不同的規(guī)定,一般為7個字符。不過這里有些可能會被忽略的就是書寫格式,在C語言中書寫格式也是需要被注意的,因為格式也可以當作C語言的語法項目,如語句是以分號‘;’作為結束的標志的而不是以換行作為結束標志,其實英語也有要求比如什么時候該使用句號什么時候該使用逗號等等只不過我們日常要求并不注意,而且也可以看的懂所以不太較真。
綜上所述我們要學好一門程序設計語言首先就要象學習英語一樣先熟記至少要熟悉這門語言的“單詞”和“語法”然后才能談得上使用,俗話說“萬丈高樓平地起”,學好C語言的必要前提就是先打下堅實的C語言基礎,所以潭先生的書作為一本很好的教材,我建議是不能丟的,而且還要反復看,至少剛開始我學習的時候上機機會不多,就是反復看懂看明白這本書,有些東西該記的還是要記尤其是一些重要的語法比如標識符、數據類型、語句的特點、函數的棧式結構,指針的意義等等。
最后始終記住這點在沒有實踐之前,先打下堅實的理論基礎吧,畢竟理論是實踐的先行,理論可以更好的指導實踐。即使再低點的要求至少要先熟悉理論吧,畢竟“摸著石頭過河”感覺還是盲目以及痛苦的。
“語義”即語句的意思、含義。同人類語言一樣,程序設計語言最重要的目的還是“交流”,所以寫一段沒有任何作用的代碼就如同說一句沒有任何意思的話是沒有意義的,在這一點上兩者是共同的,至于在其他某些方面兩者也有驚人的相似之處,試舉一例吧,比如說可以有不同的表達表示同一個意思,如微型計算機同個人計算機就是同一個意思,在C語言中比如要讓變量i自增1,可以有i=i+1或者i+=1等等。不過與人類語言相比,程序設計語言畢竟是與計算機交流,交流對象計算機與人類的不同也決定了程序設計語言與人類語言還是有所區(qū)別,甚至可以說是存在巨大的“鴻溝”,這也就是學習程序設計語言的重點。
與人類相區(qū)別,計算機最大的不同之處在于沒有“自己”的“思維”,沒有象人類那樣豐富的感情,所以在交流過程中對于人類的跳躍性的思維,對于人類的“幽默”無法理解也沒有絲毫的興趣。比如說對與同樣一句話“Do it”,在不同的場景不同的說話語氣,對10個人來說就會有10種不同的回答,有的人可能會認為這是合理的要求,有的人可能會認為這可能是個玩笑而不與理睬,有的人則可能認為語氣要求有些過分而感到非常憤怒……,但對所有的計算機來說則是嚴格執(zhí)行。不過也正是由于計算機“機械”“笨著”的可愛而深得人們的喜愛并被廣泛使用,因為對我們來說,計算機就象一個忠實的士兵一樣在執(zhí)行我們的命令并且作為指揮者,當然我們希望計算機在合適的時間干切當的事情。而要達到這個目的,很湊巧有點類似于社會的“權利與義務”法則一樣,我們也有自己的義務那就是下達明確而又正確的“命令”。
首先明確,即我們要在與計算機交流時“語義”必須明確,否則計算機將無所適從,因此作為交流工具的程序設計語言的“語義”也必須是能夠明確無二義的。當然程序設計語言的設計者已經注意到這一點,在設計時就回避了這個問題,所以我們——程序設計語言的使用者——程序員也就無須過多關注這點,也就是說使用何種程序設計語言(C,Basic,Pascal等)并不是我們要關注的重點。
其次正確,包括正確的輸入以及正確的邏輯。由于計算機 “忠實”得有點“盲目”以至于對事情的對錯毫無判斷力,就象一把槍一樣,在警察手里它就是正義的化身,而在土匪手里就成了惡魔的代言人,因此要時刻記住計算機是沒有錯的,“錯誤”掌握在我們自己手里,這也就決定了我們在編程時是不是應該投入更多的精力來糾正我們自己所犯下的錯誤上面來?除此之外,我們智慧的結晶——程序,在我們的上帝——顧客,在程序的使用者看來就象個黑匣子,他們只管輸入哪怕是錯誤的輸入卻同樣期待能得到正確的結果,而對于上帝我們除了祈禱和期望之外還能有什么選擇?因此對于輸入的不可預期的程序源數據,我們是不是也應該花更多的時間進行處理呢?
先小結下,由于我們在編程時需要對于輸入的不可預期的程序源數據以及提高我們自己的邏輯正確性花費更多的時間,因此這也就是我們編程訓練所應該關注的重點,而不是關注于何種實際的程序設計語言。
綜合上面的敘述,我們把編程看成程序設計語言的“單詞”“語法”“明確的語義”“正確的語義”四個部分,可以看出前面三個部分是幾乎所有的程序設計語言自身所具有的,“單詞”“語法”不同的程序設計語言有所不同,但如果你仔細觀察所有的程序設計語言,可以分成幾類,而且有很多地方也有相通的地方,有點象一通百通的味道,這也就是為什么很多有經驗的程序員可以在很短的時間就能熟悉其他語言的原因。至于“明確的語義”這是所有的程序設計語言都應該具備的,只是表述的方法由于程序設計的“單詞”“語法”不同表述不同而已,但讓計算機明白該做什么這點是相同的。最后“正確的語義”包括開闊的,正確的邏輯思路以及發(fā)現并糾正錯誤的能力則是屬于我們自己的,這也是我們區(qū)別于其他人的地方,這些都需要在經常性的編程實踐中去積累去開闊,所以是我們所應該關注的重中之重。
跟許多前輩一樣,我是建議初學編程者先熟練掌握一門語言的,至于怎么學習,我想書本是綱領,我們首先要熟悉一門語言的粗枝大葉,在編程的過程中不至于老是去翻書查找一門語言的基本語法,比如說函數的傳遞方式,函數調用的一些特點,這樣不僅非常浪費時間而且一直困擾于語法中使得自己有種身緣“廬山”中的那種非常迷茫的感覺。就象施工一樣,建造一個茅屋可能沒有圖紙,抱著邊建邊看的態(tài)度興許能完成(事實上你自己腦海里至少也有個大致的樣子),但要建造一座大廈,沒有圖紙,困難可想而知。當然光有圖紙還是不夠的,我們可能在施工的過程中發(fā)現一些問題,這樣我們在慢慢修改原來的方案或者原先有些地方描述不清楚通過具體施工確認我們的想法。因此編程實踐同樣不可少,編程實踐不僅可以“讓語義正確”即開闊編程思路,發(fā)現錯誤(調試),累計編程技巧,而且可以在編程過程中熟悉這門語言,熟悉這門語言的細節(jié)部分,但也請記住這些細節(jié)雖然重要,但也僅僅是細節(jié)。當然光看書,光有理論那也是不行的,有“綱領”而沒有“章程”,有“綱領”而沒有實施那同樣也是沒用的,畢竟實踐是檢驗真理的唯一標準,實踐過程中給理論修枝剪葉。
總得來說熟悉一門程序設計語言的語法是編程實踐的先行,而編程實踐是可以更好促進對程序設計語言基本語法知識的理解和熟悉,而積累的寶貴的編程經驗則我們自己最珍貴的地方,最獨一無二的地方,是所有程序設計語言所沒有的。
寫到這里,我想現在應該是回答第一個問題的時候了,有人說我學了這么長時間的C語言還是沒編過一個漂亮花哨的程序,編出來的都是丑陋的而且看起來沒什么價值的程序,一點自豪感都沒有便喪失了對編程的興趣,為什么前面我一直強調一門語言豐富的編程經驗是你最珍貴的地方呢?原因就在于編程不僅僅是把我們的想法把我們的思路用程序設計語言寫下來就夠了,要得到實際運用還需要與計算機的其他知識如網絡,低層硬件,圖形圖象,開發(fā)環(huán)境等,甚至還有其他學科知識比如自動控制,通訊等相結合,而這些知識需要我們在以后的學習過程中學習,比如一些后續(xù)課程,數據結構與算法,操作系統(tǒng),數據庫,計算機網絡,軟件工程等等,如果有興趣你也可以在以后的課程中專門學習視窗程序的編程,或者也可以學習自己做個網站,那時侯就真的是有自豪感并且貨真價實的了。當然那時侯可能你會有另外的想法比如說做嵌入式程序員,網絡程序員,甚至去搞算法研究等等了。不管你選擇做什么,書本知識都是大家所共有的,是全人類的財富,而自身的知識,尤其是經驗卻實實在在是你自己的,最后我還想強調一遍,這是我們最珍貴的地方。
所以在此之前,我知道打基礎是痛苦而且沒有多少成就感的過程,但是在化蛹成蝶之前,我們還是要繼續(xù)我們做而且認真的做我們的毛毛蟲,因為我們知道我們會有變成美麗蝴蝶的那一天。