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