C語言學習

2022-11-19 23:39:06 字數 4435 閱讀 4256

前言:兩個原因促使我寫下這篇文章,第一就是作為過來人根據我自己的經驗我知道程式設計的初學者一般都很興奮也都有種困惑,一方面對執行在計算機(注:不特別指明都指個人微型計算機)的五花八門如精彩的遊戲程式,多姿多彩的**等等漂亮的視窗程式所著迷,另一方面大部分的初學者(如計算機專業的低年級學生)都是從簡單命令列程式「hello world!

」開始入手而且很長一段時間都無法接觸到日常經常使用的視窗程式,由此好奇者有之,迷惑者有之等等,更遺憾的是也有少部分人因為困惑對程式設計逐漸失去興趣。第二就是今天妹妹看c程式語言(潭浩強的那本,相信大部分學過c語言的人都聽過)碰到乙個例題沒有看懂,而作為計算機專業畢業的老哥自然義不容辭地承擔起了講解的任務,在噼里啪啦的大說之後,老妹終於弄懂了例題程式的意思,但仍然不過癮,竟然問起我如何學好c語言,弄得我心一驚,這裡我還是有點自知之明的,因為我知道我並不是什麼大師,甚至自己對計算機世界也經常是一片茫然,不過看著她那「崇拜」的眼神,不說點什麼似乎有點不大好,只**著頭皮把自己以前的一些理解講了一番。所以既然知道有這個需要,儘管自己見識淺薄,也抱著「區區陋見假如能夠對後學者能夠有所幫助那是再好不過了,即使有所偏頗噹噹笑話看看能有助於大家飯後生活也是美德一件」的心情就寫下了這篇文章。

我是很樂意將計算機(程式設計)語言跟人類語言做模擬的,在我看來學習程式語言就象學習外語一樣,通過計算機語言與計算機交流就如同在使用外語與老外交流一樣。通常學習語言比如英語有單詞,語法,語義三個部分組成,單詞是構成語言的最基本的要素,語法告訴我們單詞如何構成語句,語義則告訴我們單詞構成的語句的意思,類似的程式語言中也是有[1] 「單詞」,「語法」,「語義」三部分組成,其中跟人類語言一樣,「單詞」「語法」是基礎,而為達到交流的目的「語義」是整個程式語言的重點。當然相對人類語言(以英語為例)而言程式語言(以c語言為例)顯然要有簡單得多的組成,所以這裡我們要首先確立自己對學好程式語言的信心。

下面試著加以說明,其中可能有些模擬不太適當,不過好象也差不多吧,你自己也可以試著舉出更好的例子以使自己更容易明白,我這裡就拋磚引玉吧。

1、基礎

先從「單詞」談起,在英語中就是由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語言基礎,所以潭先生的書作為一本很好的教材,我建議是不能丟的,而且還要反覆看,至少剛開始我學習的時候上機機會不多,就是反覆看懂看明白這本書,有些東西該記的還是要記尤其是一些重要的語法比如識別符號、資料型別、語句的特點、函式的棧式結構,指標的意義等等。

最後始終記住這點在沒有實踐之前,先打下堅實的理論基礎吧,畢竟理論是實踐的先行,理論可以更好的指導實踐。即使再低點的要求至少要先熟悉理論吧,畢竟「摸著石頭過河」感覺還是盲目以及痛苦的。

2、重點

「語義」即語句的意思、含義。同人類語言一樣,程式語言最重要的目的還是「交流」,所以寫一段沒有任何作用的**就如同說一句沒有任何意思的話是沒有意義的,在這一點上兩者是共同的,至於在其他某些方面兩者也有驚人的相似之處,試舉一例吧,比如說可以有不同的表達表示同乙個意思,如微型計算機同個人計算機就是同乙個意思,在c語言中比如要讓變數i自增1,可以有i=i+1或者i+=1等等。不過與人類語言相比,程式語言畢竟是與計算機交流,交流物件計算機與人類的不同也決定了程式語言與人類語言還是有所區別,甚至可以說是存在巨大的「鴻溝」,這也就是學習程式語言的重點。

與人類相區別,計算機最大的不同之處在於沒有「自己」的「思維」,沒有象人類那樣豐富的感情,所以在交流過程中對於人類的跳躍性的思維,對於人類的「幽默」無法理解也沒有絲毫的興趣。比如說對與同樣一句話「do it」,在不同的場景不同的說話語氣,對10個人來說就會有10種不同的回答,有的人可能會認為這是合理的要求,有的人可能會認為這可能是個玩笑而不與理睬,有的人則可能認為語氣要求有些過分而感到非常憤怒……,但對所有的計算機來說則是嚴格執行。不過也正是由於計算機「機械」「笨著」的可愛而深得人們的喜愛並被廣泛使用,因為對我們來說,計算機就象乙個忠實的士兵一樣在執行我們的命令並且作為指揮者,當然我們希望計算機在合適的時間幹切當的事情。

而要達到這個目的,很湊巧有點類似於社會的「權利與義務」法則一樣,我們也有自己的義務那就是下達明確而又正確的「命令」。

首先明確,即我們要在與計算機交流時「語義」必須明確,否則計算機將無所適從,因此作為交流工具的程式語言的「語義」也必須是能夠明確無二義的。當然程式語言的設計者已經注意到這一點,在設計時就迴避了這個問題,所以我們——程式語言的使用者——程式設計師也就無須過多關注這點,也就是說使用何種程式語言(c,basic,pascal等)並不是我們要關注的重點。

其次正確,包括正確的輸入以及正確的邏輯。由於計算機 「忠實」得有點「盲目」以至於對事情的對錯毫無判斷力,就象一把槍一樣,在警察手裡它就是正義的化身,而在土匪手裡就成了惡魔的代言人,因此要時刻記住計算機是沒有錯的,「錯誤」掌握在我們自己手裡,這也就決定了我們在程式設計時是不是應該投入更多的精力來糾正我們自己所犯下的錯誤上面來?除此之外,我們智慧型的結晶——程式,在我們的上帝——顧客,在程式的使用者看來就象個黑匣子,他們只管輸入哪怕是錯誤的輸入卻同樣期待能得到正確的結果,而對於上帝我們除了祈禱和期望之外還能有什麼選擇?

因此對於輸入的不可預期的程式源資料,我們是不是也應該花更多的時間進行處理呢?

先小結下,由於我們在程式設計時需要對於輸入的不可預期的程式源資料以及提高我們自己的邏輯正確性花費更多的時間,因此這也就是我們程式設計訓練所應該關注的重點,而不是關注於何種實際的程式語言。

為了加深印象,下面我們舉個實際的例子來說明這點。先看題目要求「輸入一行字串(全字母或空格),統計其中的單詞數量,單詞之間用空格分開」,應該說這是個簡單的題目,有些人可能一看到這個題目很快就給出了自己的答案。如有些人會想單詞是以空格分開的,我們統計其中空格的數量再加上最後乙個單詞不就是單詞的個數嗎,因此便很快給出如下答案。

/*program1*/

#include<>

main()

編譯執行,然後輸入「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<>

main()

執行一遍,發現結果是正確的,單詞之間不管你是有幾個空格,不管是兩個也好,三個也好都能夠正確執行,但是回過頭來我們看下這個程式是不是還有些可以改進的地方呢?我們再看如下乙個程式

/* program 3[3]*/

#include<>

main()

printf("there are %d words in the line.\n",num);

}輸入測試用例也能夠完全正確,看看源程式,其中增加了乙個標誌位便把所有的情況給考慮進去了,相比前乙個程式,程式2就是直白的描述了解題的思路,而程式3看起來好象不好理解但似乎更能滿足我們作為「天才程式設計師」的慾望,這也就是程式設計時使用的一些小技巧。

總體比較三個程式,可以說類似程式1的錯誤——邏輯錯誤是我們程式設計師比較容易犯的,也是在程式設計除錯過程中最費時間的,至於語法錯誤編譯器可以很快的給我們找出錯誤的地方程式2邏輯正確但相比程式1思路要更難想到,程式3思路不但正確而且還在程式設計的過程中使用了一些程式設計技巧,所有這些開闊的邏輯思路(解決問題),快速的除錯方法及過程(發現錯誤),累積的程式設計技巧(讓程式讓「好看」)都需要我們在程式設計實踐中去獲得,這是寶貴的經驗也我們作為程式設計師最珍貴的地方,而且最重要的這些經驗是屬於我們自己的,獨一無二的。

C語言學習總結

ifndef 語句1 ifndef 標識1 語句2 define 標識1 語句3 endif 語句4 語句5 該段 意思是 如果標識1沒有被定義,則重定義標示1,即執行語句2 語句3 如果標識1已經被定義,則直接跳過語句2 語句3,直接執行語句4 語句5 條件指示符 ifndef 的最主要目的是防止...

C語言學習心得

第一層 初學c語言,基本上是隨便拿一本c語言入門,從helloworld開始了。學完後,能記住一些最簡單的語法,勤奮者,照書畫貓敲幾個例程體驗一把。但大部分工科生應付完考試,也就止於此了,等大四找工作時,c語言基礎語法早就丟到了爪哇國了,這也是為何招聘時我們發現很多人一問三不知的原因了。第二層 學習...

c語言學習心得

摘要 林林總總的計算機語言,林林總總的計算機技術,林林總總的計算機書籍讓我們初入計算機的菜鳥一次就嚇的沒有勇氣。迷茫和徘徊讓我們喪失了時間和信心。沒有訣竅嗎?有的,看你怎麼把握了,接下來我就以c語言為例子,講一下有關學習的方法和技巧,同時也分享一下我學c的感想。林林總總的計算機語言,林林總總的計算機...