經(jīng)驗分享之學(xué)習(xí)C語言的方法
C語言是一個很古老的語言,新手學(xué)習(xí)C語言,要具備一定的技巧,這樣才能夠達到事半功倍的效果。
一 ,怎樣學(xué)習(xí)C語言
很多人對學(xué)習(xí)C語言感到無從下手,經(jīng)常問我同一個問題:究竟怎樣學(xué)習(xí)C語言?我是一個教師,已經(jīng)開發(fā)了很多年的程序,和很多剛剛起步的人一樣,學(xué)習(xí)的第一個計算機語言就是C語言。經(jīng)過這些年的開發(fā),我深深的體會到C語言對于一個程序設(shè)計人員多么的重要,如果不懂C語言,你想寫底層程序這幾乎聽起來很可笑,不懂C語言,你想寫出優(yōu)秀高效的程庌輌這簡直就是天方夜譚。為什么C語言如此重要呢?
第一:C語言語法結(jié)構(gòu)很簡潔精妙,寫出的程序也很高效,很便于描述算法,大多數(shù)的程序員愿意使用C語言去描述算法本身,所以,如果你想在程序設(shè)計方面有所建樹,就必須去學(xué)它。
第二:C語言能夠讓你深入系統(tǒng)底層,你知道的操作系統(tǒng),哪一個不是C語言寫的?所有的windows,Unix,Linux,Mac,os/2,沒有一個里外的,如果你不懂C語言,怎么可能深入到這些操作系統(tǒng)當(dāng)中去呢?更不要說你去寫它們的內(nèi)核程序了。
第三:很多新型的語言都是衍生自C語言,C++,Java,C#,J#,perl...哪個不是呢?掌握了C語言,可以說你就掌握了很多門語言,經(jīng)過簡單的學(xué)習(xí),你就可以用這些新型的語言去開發(fā)了,這個再一次驗證了C語言是程序設(shè)計的重要基礎(chǔ)。還有啊,多說一點:即使現(xiàn)在招聘程序員,考試都是考C語言,你想加入it行業(yè),那么就一定要掌握好C語言。
那么究竟怎樣學(xué)習(xí)C語言呢?
1:工欲善其事,必先利其器
這里介紹幾個學(xué)習(xí)C語言必備的東東:
一個開發(fā)環(huán)境,例如turbo C 2.0,這個曾經(jīng)占據(jù)了DOS時代開發(fā)程序的大半個江山。但是現(xiàn)在windows時代,用turbo C有感覺不方面,編輯程序起來很吃力,并且拖放,更沒有函數(shù)變量自動感應(yīng)功能,查詢參考資料也不方便。建議使用Visual C++,這個東西雖然比較大塊頭,但是一旦安裝好了,用起來很方便。
一本學(xué)習(xí)教程,現(xiàn)在C語言教材多如牛毛,但推薦大家使用《C語言程序設(shè)計》譚浩強主編 第二版 清華大學(xué)出版社,此書編寫的很適合初學(xué)者,并且內(nèi)容也很精到。
除此以外,現(xiàn)在有很多輔助學(xué)習(xí)的軟件,畢竟現(xiàn)在是Window時代了,學(xué)習(xí)軟件多如牛毛,不象我們當(dāng)初學(xué)習(xí),只有讀書做題這么老套。我向大家推薦一個“集成學(xué)習(xí)環(huán)境(C語言)”,里邊的知識點總結(jié)和例程講解都非常好,還有題庫測試環(huán)境,據(jù)說有好幾千題,甚至還有一個windows下的trubo C,初學(xué)者甚至不用裝其它的編譯器,就可以練習(xí)編程了,非常適合初學(xué)者。還有一個“C語言學(xué)習(xí)系統(tǒng)”軟件,不過感覺只是一個題庫系統(tǒng),如果你覺得題做的不夠,不妨也可以試試。
2:葵花寶典
學(xué)習(xí)計算機語言最好的方法是什么?答曰:讀程序。
沒錯,讀程序是學(xué)習(xí)C語言入門最快,也是最好的方法。如同我,現(xiàn)在學(xué)習(xí)新的J#,C#等其他語言,不再是抱著書本逐行啃,而是學(xué)習(xí)它們的例程。當(dāng)然,對于沒有學(xué)過任何計算機語言的初學(xué)者,最好還是先閱讀教程,學(xué)習(xí)完每一章,都要認真體會這一章的所有概念,然后不放過這一章中提到的所有例程,然后仔細研讀程序,直到每一行都理解了,然后找?guī)讉€編程題目,最好是和例程類似的或一樣的,自己試圖寫出這段已經(jīng)讀懂的程序,不要以為例程你已經(jīng)讀懂了,你就可以寫出和它一樣的程序,絕對不一定,不相信你就試一試吧,如果寫不出來,也不要著急,回過頭來再繼續(xù)研究例程,想想自己為什么寫不出來,然后再去寫這段程序,反反復(fù)復(fù),直到你手到擒來為止,祝賀你,你快入門了。
3:登峰造極
寫程序的最高境界其實就是掌握各種解決問題的手段(數(shù)據(jù)結(jié)構(gòu))和解決問題的方法(算法)。
是不是寫出底層程序就是程序設(shè)計高手呢?非也,寫底層程序,無非是掌握了硬件的結(jié)構(gòu),況且硬件和硬件還不一樣,要給一個芯片寫驅(qū)動程序,無非就是掌握這塊芯片的各種寄存器及其組合,然后寫值讀值,僅此而已。這不過是熟悉一些io函數(shù)罷了。那么怎樣才算精通程序設(shè)計呢?怎樣才能精通程序設(shè)計呢?
舉個例子:你面前有10個人,找出一個叫“張三”的人,你該怎么辦?
第一種方法:直接對這10個人問:“誰叫張三”。
第二種方法:你挨個去問“你是不是張三?”,直到問到的這個人就是張三。
第三種方法:你去挨個問一個人“你認不認識張三,指給我看”。不要小看這個問題,你說當(dāng)然會選第一種方法,沒錯恭喜你答對了,因為這個方法最快,效率最高,但是在程序設(shè)計中找到解決問題的最優(yōu)方法和你用的手段卻是考驗一個程序員程序設(shè)計水平的重要標(biāo)志,而且是不容易達到的。
剛才這個問題類似于數(shù)據(jù)結(jié)構(gòu)和算法中的:Map數(shù)據(jù)結(jié)構(gòu),窮舉查找和折半查找。所以掌握好數(shù)據(jù)結(jié)構(gòu)和一些常用算法,是登峰造極的必然之路。最后給大家推薦嚴(yán)尉敏的《數(shù)據(jù)結(jié)構(gòu)》清華大學(xué)出版社,希望每一個想成為程序設(shè)計高手的人研讀此書。
二,語言學(xué)習(xí)方法
談?wù)勁嫉膶W(xué)習(xí)方法,拋磚引玉!
學(xué)習(xí)不論講不講方法,最終都能學(xué)會。但是別人1個月學(xué)會了,而你卻100年才學(xué)會,這不就晚了么?:)所以說,學(xué)習(xí)還是要講究方法的。學(xué)習(xí)方法正確,事半功倍;學(xué)習(xí)方法不正確,事倍而功半。
什么才是學(xué)習(xí)C語言的捷徑?我的答案是看書。書中所寫,是前人數(shù)十年經(jīng)驗所寫,看十本書,就相當(dāng)于汲取了前人數(shù)十年的功力,那么你的內(nèi)功也會迅速上升1甲子。書當(dāng)然要看好書,只有好書才營養(yǎng)豐富。假如你花了1天時間看了一本破書,而該書介紹的知識雖然對于你來說是全新的知識,但是由于書中組織不當(dāng)、或者深度不夠,使你獲取的營養(yǎng)很少,還不如自己研究一天來的快,這種書就不值當(dāng)看了。
學(xué)習(xí)C語言要看那些好書?我認為首先要把基礎(chǔ)書給看扎實了,比如《C語言之四書五經(jīng)》中介紹的4本。(雖然這些書很多已經(jīng)絕版了,但我相信電子版也是很有益處。況且,如果你真的想看,我相信你一定有辦法搞的到。)這些書你會在很短的時間內(nèi)看完(比如一兩個月),這取決于你的基礎(chǔ)和悟性。之后要看那些書呢?
我不妨再列幾本。Bjarne Stroustrup的《C++程序設(shè)計語言》(The C++ Programming Language)一定要看,這本書里面對于C的一些基礎(chǔ)概念的定義,比我見過的其他任何C語言書都要全,都要仔細;Bjarne Stroustrup的《C++語言的設(shè)計與演化》(The Design and Evolution of C++)和David R.Hanson 的《C語言接口與實現(xiàn) 創(chuàng)建可重用軟件的技術(shù)》(C Interfaces and Implaementations Techniques for Creating Reusable Software)一定要看,這兩本書講述了如何用C來實現(xiàn)異常處理、實現(xiàn)類型的封裝和擴展等一些大的項目中經(jīng)常用到的高級技術(shù)。
其他的書,操作系統(tǒng)的要看,編譯原理的要看,算法的要看,模式的也要看。讀書破萬卷,coding如有神。總而言之,就如《傳》中云:“生而知之者,上也;學(xué)而知之者,次也;困而學(xué)之又其次也。”我們不能總是因困而學(xué)之,而要做到兵馬未動,糧草先行。
看書是學(xué)習(xí)的導(dǎo)向,書中能一一介紹清楚概念,但書卻不能把應(yīng)用的細節(jié)一一介紹給你,因為應(yīng)用總是招數(shù)繁復(fù),變化多端。因此我們要想熟悉招數(shù),懂得書中所講怎么使用,還要多讀源碼。Linus給別人解答問題的時候,常說Read the ****ing source code;候捷也在其文中提到“源碼之前,了無秘密。”這就是大師的箴言呀。源碼就像是動畫、就像是幻燈片,把書中的招式一一演練給你看。可以說高手的經(jīng)驗大都是源自代碼。源碼和書一樣,也是要看好的,不要看差的。在此,我推薦看Linux kernel source code 和 Linux tcp/ip source code。這兩套代碼都是開源的,垂手可得。
此外,還可以配合著Andrew S.Tanenbaum的《操作系統(tǒng)的設(shè)計與實現(xiàn)》(Operating Systems:Design and Implementation)、毛德操 胡希明的《Linux內(nèi)核 源代碼情景分析》、Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman合著的《Linux設(shè)備驅(qū)動程序》(Linux Device Driver,3e)、W.Richard Stevens《TCP/IP詳解(3部)》 (TCP/IP Illustracted )、W.Richard Stevens《UNIX環(huán)境高級編程》(Advanced Programming in the UNIX Environment,新版增加了Linux kernel的內(nèi)容)等書來看,方便的很當(dāng)然程序不是看出來的,是寫出來的。
我高中的時候每天堅持寫6個小時程序,《數(shù)據(jù)結(jié)構(gòu)》和排列組合、圖論方面的習(xí)題反復(fù)做了N遍。到現(xiàn)在雖然已經(jīng)時隔五六年,很多內(nèi)容早已淡忘掉,但卻培養(yǎng)了我很強的編碼能力和調(diào)試能力,直到現(xiàn)在還對我的工作有很大的幫助。
學(xué)習(xí)忌貪多、忌浮躁、忌急功近利、忌目中無人。把學(xué)習(xí)計劃放的長一些,培養(yǎng)一個好的學(xué)習(xí)方法,一步一步慢慢走,終能成為高手。