開始入手並且很長一段時間都沒法接觸到平常常用的視窗程序,由此好奇者有之,迷惑者有之等等,更遺憾的是也有少部分人由於困惑對編程逐漸失去興趣。第二就是今天妹妹看C程序設計語言(潭浩強的那本,相信大部分學過C語言的人都聽過)碰到一個例題沒有看懂,而做爲計算機專業畢業的老哥天然責無旁貸地承擔起了講解的任務,在噼裏啪啦的大說以後,老妹終於弄懂了例題程序的意思,但仍然不過癮,居然問起我如何學好C語言,弄得我心一驚,這裏我仍是有點自知之明的,由於我知道我並非什麼大師,甚至本身對計算機世界也常常是一片茫然,不過看着她那「崇拜」的眼神,不說點什麼彷佛有點不大好,只好硬着頭皮把本身之前的一些理解講了一番。因此既然知道有這個須要,儘管本身見識淺薄,也抱着「區區陋見假如可以對後學者可以有所幫助那是再好不過了,即便有所偏頗噹噹笑話看看能有助於你們飯後生活也是美德一件」的心情就寫下了這篇文章。我是很樂意將計算機(程序設計)語言跟人類語言作類比的,在我看來學習程序設計語言就象學習外語同樣,經過計算機語言與計算機交流就如同在使用外語與老外交流同樣。一般學習語言好比英語有單詞,語法,語義三個部分組成,單詞是構成語言的最基本的要素,語法告訴咱們單詞如何構成語句,語義則告訴咱們單詞構成的語句的意思,相似的程序設計語言中也是有[1] 「單詞」,「語法」,「語義」三部分組成,其中跟人類語言同樣,「單詞」「語法」是基礎,而爲達到交流的目的「語義」是整個程序設計語言的重點。固然相對人類語言(以英語爲例)而言程序設計語言(以C語言爲例)顯然要有簡單得多的組成,因此這裏咱們要首先確立本身對學好程序設計語言的信心。下面試着加以說明,其中可能有些類比不太適當,不過好象也差很少吧,你本身也能夠試着舉出更好的例子以使本身更容易明白,我這裏就拋磚引玉吧。程序員
一、基礎面試
先從「單詞」談起,在英語中就是由26個英文字母以及26個英文字母構成的單詞組成,學習語言咱們首先應該記憶的就是「單詞」,26個英文字母A,B,C,……而後就是使人頭痛的英文單詞,記憶的過程是痛苦的至少我學英語時最惱火的地方就是反覆記憶總是忘記的單詞,相似的在C語言中咱們能夠做這樣的類比,C語言的單詞是由26個英文字母、數字(0,1,2……9)、運算符以及其餘特殊符號組成,因此相比而言學習C語言是多麼的幸福。「語法」,在英語中是如常見構詞法、時態、經常使用句型、特殊用法、固定用法等等(呵呵,不是語言專家若有興趣能夠參考英語語法書籍),僅拿構詞法來講動詞後面加er就變成名詞(work-worker),名詞後面加y就變成形容詞(wind-windy)等十多種變換還要記憶些特殊變換,複雜且繁瑣,假如算上時態、句型等那就更復雜了。在C語言中也一樣也存在有語法,好比標識符、常量、表達式、數據定義、函數定義、變量初始化、語句構成、預處理命令等大體8種語法,如標識符[2]可由字母、數字以及下劃線組成,且必須以字母或下劃線開頭,區分大小寫,另外在不一樣的編譯器中字符數目有不一樣的規定,通常爲7個字符。不過這裏有些可能會被忽略的就是書寫格式,在C語言中書寫格式也是須要被注意的,由於格式也能夠看成C語言的語法項目,如語句是以分號‘;’做爲結束的標誌的而不是以換行做爲結束標誌,其實英語也有要求好比何時該使用句號何時該使用逗號等等只不過咱們平常要求並不注意,並且也能夠看的懂因此不太較真。綜上所述咱們要學好一門程序設計語言首先就要象學習英語同樣先熟記至少要熟悉這門語言的「單詞」和「語法」而後才能談得上使用,俗話說「萬丈高樓平地起」,學好C語言的必要前提就是先打下堅實的C語言基礎,因此潭先生的書做爲一本很好的教材,我建議是不能丟的,並且還要反覆看,至少剛開始我學習的時候上機機會很少,就是反覆看懂看明白這本書,有些東西該記的仍是要記尤爲是一些重要的語法好比標識符、數據類型、語句的特色、函數的棧式結構,指針的意義等等。最後始終記住這點在沒有實踐以前,先打下堅實的理論基礎吧,畢竟理論是實踐的先行,理論能夠更好的指導實踐。即便再低點的要求至少要先熟悉理論吧,畢竟「摸着石頭過河」感受仍是盲目以及痛苦的。編程
二、重點函數
「語義」即語句的意思、含義。同人類語言同樣,程序設計語言最重要的目的仍是「交流」,因此寫一段沒有任何做用的代碼就如同說一句沒有任何意思的話是沒有意義的,在這一點上二者是共同的,至於在其餘某些方面二者也有驚人的類似之處,試舉一例吧,好比說能夠有不一樣的表達表示同一個意思,如微型計算機同我的計算機就是同一個意思,在C語言中好比要讓變量i自增1,能夠有i=i+1或者i+=1等等。不過與人類語言相比,程序設計語言畢竟是與計算機交流,交流對象計算機與人類的不一樣也決定了程序設計語言與人類語言仍是有所區別,甚至能夠說是存在巨大的「鴻溝」,這也就是學習程序設計語言的重點。與人類相區別,計算機最大的不一樣之處在於沒有「本身」的「思惟」,沒有象人類那樣豐富的感情,因此在交流過程當中對於人類的跳躍性的思惟,對於人類的「幽默」沒法理解也沒有絲毫的興趣。好比說對與一樣一句話「Do it」,在不一樣的場景不一樣的說話語氣,對10我的來講就會有10種不一樣的回答,有的人可能會認爲這是合理的要求,有的人可能會認爲這多是個玩笑而不與理睬,有的人則可能認爲語氣要求有些過度而感到很是憤怒……,但對全部的計算機來講則是嚴格執行。不過也正是因爲計算機「機械」「笨着」的可愛而深得人們的喜好並被普遍使用,由於對咱們來講,計算機就象一個忠實的士兵同樣在執行咱們的命令而且做爲指揮者,固然咱們但願計算機在合適的時間幹切當的事情。而要達到這個目的,很湊巧有點相似於社會的「權利與義務」法則同樣,咱們也有本身的義務那就是下達明確而又正確的「命令」。首先明確,即咱們要在與計算機交流時「語義」必須明確,不然計算機將無所適從,所以做爲交流工具的程序設計語言的「語義」也必須是可以明確無二義的。固然程序設計語言的設計者已經注意到這一點,在設計時就回避了這個問題,因此咱們——程序設計語言的使用者——程序員也就無須過多關注這點,也就是說使用何種程序設計語言(C,Basic,Pascal等)並非咱們要關注的重點。其次正確,包括正確的輸入以及正確的邏輯。因爲計算機 「忠實」得有點「盲目」以致於對事情的對錯毫無判斷力,就象一把槍同樣,在警察手裏它就是正義的化身,而在土匪手裏就成了惡魔的代言人,所以要時刻記住計算機是沒有錯的,「錯誤」掌握在咱們本身手裏,這也就決定了咱們在編程時是否是應該投入更多的精力來糾正咱們本身所犯下的錯誤上面來?除此以外,咱們智慧的結晶——程序,在咱們的上帝——顧客,在程序的使用者看來就象個黑匣子,他們只管輸入哪怕是錯誤的輸入卻一樣期待能獲得正確的結果,而對於上帝咱們除了祈禱和指望以外還能有什麼選擇?所以對於輸入的不可預期的程序源數據,咱們是否是也應該花更多的時間進行處理呢?先小結下,因爲咱們在編程時須要對於輸入的不可預期的程序源數據以及提升咱們本身的邏輯正確性花費更多的時間,所以這也就是咱們編程訓練所應該關注的重點,而不是關注於何種實際的程序設計語言。爲了加深印象,下面咱們舉個實際的例子來講明這點。先看題目要求「輸入一行字符串(全字母或空格),統計其中的單詞數量,單詞之間用空格分開」,應該說這是個簡單的題目,有些人可能一看到這個題目很快就給出了本身的答案。若有些人會想單詞是以空格分開的,咱們統計其中空格的數量再加上最後一個單詞不就是單詞的個數嗎,所以便很快給出以下答案。/Program1/#include<stdio.h>main(){ char string[81]; int i,num = 0; char c; gets(string); for(i = 0;(c=string[i])!='0';i++) if(c == ' ') num++; printf("There are %d words in the line.n",num+1);}編譯運行,而後輸入「I am a student」,得出正確答案「There are 4 words in the line.」在輸入幾個相似的測試用例,都得出正確答案,最後確信無誤便自信滿滿的交出本身的答卷。應該說正確的輸入狀況下,這個程序毫無疑問是可以正確運行的,但這種正確性是很是脆弱的,你不能期望用戶和你同樣聰明而且不犯錯誤,況且即便是神仙那也有打盹的時候。假如用戶輸入「 I am a student」,「 I am a student」, 「 I am a student 」……這種狀況下,你是否是應該從新修正你的思路呢?如今我這樣考慮一個單詞應該是字母后面緊接着一個空格或者結束符號,因此從新寫下以下程序。/ Program 2/#include<stdio.h>main(){ char string[81]; int i,num = 0; char c; gets(string); for(i = 0;(c = string[i])!='0';i++) if(c != ' ' &&(string[i+1] ==' '|| string[i+1]== '0')) num++; printf("There are %d words in the line.n",num);}運行一遍,發現結果是正確的,單詞之間無論你是有幾個空格,無論是兩個也好,三個也好都可以正確運行,可是回過頭來咱們看下這個程序是否是還有些能夠改進的地方呢?咱們再看以下一個程序/ Program 3[3]/#include<stdio.h>main(){ char string[81]; int i,num = 0,word = 0;/word標誌位/ char c; gets(string); for(i = 0;(c = string[i])!='0';i++) if(c == ' ') word = 0; else if(word == 0) { word = 1; num++; } printf("There are %d words in the line.n",num);}輸入測試用例也可以徹底正確,看看源程序,其中增長了一個標誌位便把全部的狀況給考慮進去了,相比前一個程序,程序2就是直白的描述瞭解題的思路,而程序3看起來好象很差理解但彷佛更能知足咱們做爲「天才程序員」的慾望,這也就是編程時使用的一些小技巧。整體比較三個程序,能夠說相似程序1的錯誤——邏輯錯誤是咱們程序員比較容易犯的,也是在編程調試過程當中最費時間的,至於語法錯誤編譯器能夠很快的給咱們找出錯誤的地方程序2邏輯正確但相比程序1思路要更難想到,程序3思路不但正確並且還在編程的過程當中使用了一些編程技巧,全部這些開闊的邏輯思路(解決問題),快速的調試方法及過程(發現錯誤),累積的編程技巧(讓程序讓「好看」)都須要咱們在編程實踐中去得到,這是寶貴的經驗也咱們做爲程序員最珍貴的地方,並且最重要的這些經驗是屬於咱們本身的,獨一無二的。工具
三、二者之間的關係學習
綜合上面的敘述,咱們把編程當作程序設計語言的「單詞」「語法」「明確的語義」「正確的語義」四個部分,能夠看出前面三個部分是幾乎全部的程序設計語言自身所具備的,「單詞」「語法」不一樣的程序設計語言有所不一樣,但若是你仔細觀察全部的程序設計語言,能夠分紅幾類,並且有不少地方也有相通的地方,有點象一通百通的味道,這也就是爲何不少有經驗的程序員能夠在很短的時間就能熟悉其餘語言的緣由。至於「明確的語義」這是全部的程序設計語言都應該具有的,只是表述的方法因爲程序設計的「單詞」「語法」不一樣表述不一樣而已,但讓計算機明白該作什麼這點是相同的。最後「正確的語義」包括開闊的,正確的邏輯思路以及發現並糾正錯誤的能力則是屬於咱們本身的,這也是咱們區別於其餘人的地方,這些都須要在常常性的編程實踐中去積累去開闊,因此是咱們所應該關注的重中之重。跟許多前輩同樣,我是建議初學編程者先熟練掌握一門語言的,至於怎麼學習,我想書本是綱領,咱們首先要熟悉一門語言的粗心大意,在編程的過程當中不至於總是去翻書查找一門語言的基本語法,好比說函數的傳遞方式,函數調用的一些特色,這樣不只很是浪費時間並且一直困擾於語法中使得本身有種身緣「廬山」中的那種很是迷茫的感受。就象施工同樣,建造一個茅屋可能沒有圖紙,抱着邊建邊看的態度興許能完成(事實上你本身腦海裏至少也有個大體的樣子),但要建造一座大廈,沒有圖紙,困難可想而知。固然光有圖紙仍是不夠的,咱們可能在施工的過程當中發現一些問題,這樣咱們在慢慢修改原來的方案或者原先有些地方描述不清楚經過具體施工確認咱們的想法。所以編程實踐一樣不可少,編程實踐不只能夠「讓語義正確」即開闊編程思路,發現錯誤(調試),累計編程技巧,並且能夠在編程過程當中熟悉這門語言,熟悉這門語言的細節部分,但也請記住這些細節雖然重要,但也僅僅是細節。固然光看書,光有理論那也是不行的,有「綱領」而沒有「章程」,有「綱領」而沒有實施那一樣也是沒用的,畢竟實踐是檢驗真理的惟一標準,實踐過程當中給理論修枝剪葉。總得來講熟悉一門程序設計語言的語法是編程實踐的先行,而編程實踐是能夠更好促進對程序設計語言基本語法知識的理解和熟悉,而積累的寶貴的編程經驗則咱們本身最珍貴的地方,最獨一無二的地方,是全部程序設計語言所沒有的。測試