1. 程式人生 > >C語言學習日記第一篇(C語言概述)

C語言學習日記第一篇(C語言概述)

C語言學習日記第一篇——C語言概述

一,C語言概述

如果要說目前什麼語言最為火熱,人們可能會說Python、Android,學好這些語言可以讓你很輕鬆的找到一份收入不菲的工作,過上舒適的生活。但是,小編覺得,如果要說什麼語言最重要,還是得回到C語言上來。我們平時所談論到的所有語言的發展都與這門語言或多或少的有聯絡,可以毫不誇張的說,C語言奠定了現代計算機程式語言的基礎。直到今天,它仍然是我們從事程式設計行業相關人員的入門必修課。
C語言最初是在B語言的基礎上開發出來的。1972年,當時在貝爾實驗室的丹尼斯·裡奇(Dennis Ritch)和肯·湯普森(Ken Thompson)在開發UNIX系統時,設計了C語言。它開發的初衷是將其作為程式設計師使用的一種程式設計工具,成為真正有用的語言。
對於一名開發者而言,B語言過於簡單,功能有限,不能滿足持續發展的需求,在此基礎上,誕生了C語言,它的命名是取自於BCPL語言第二個字母。C語言保持了B語言和BCPL語言簡練的特點,彌補了它們在功能不足上的缺陷。

二,C語言的特點

既然C語言如此重要,那麼它和其他的語言相,到底有什麼樣的特點呢?到底是什麼樣的一門語言能夠幾乎所有程式設計開發的基礎呢?

1.執行高效

C語言程式開發時,結構較為緊湊,執行速度比較快。另外,C語言具有組合語言的微調控能力(這是目前其他很多語言都不具備的特點),即能對硬體進行一些操作,通過具體使用一些微調程式能夠獲得高效的執行速度。

2.可移植

如果一名開發人員想把UNIX系統中的程式移植到IBM大型機上面,他所要面臨的難度不亞於橫跨撒哈拉大沙漠(當然這種工作通常是一個Team來完成,但仍然工作量很大)。使用過以前的一些語言如FORTRAN的開發人員會知道,移植程式是一件極其麻煩的事情。
然而,C語言的誕生為廣大的開發人員送去了福音,通常來說,在一種系統上開發設計的程式能夠很輕鬆的在另一種系統上執行,因為在他們的系統中都帶有C語言的編譯器。從我們的個人計算機,到工作站,再到超級計算機,絕大部分都有C語言編譯器。因此,從事C語言開發的人員很少擔心移植性的問題,這是C語言應用廣泛的一個極其重要的原因。

3.面向過程語言

C語言是一種面向過程的語言,它著重於程式設計的演算法、語言的使用,例如主函式中只寫出呼叫的函式,而所呼叫的函式是在別處宣告和定義的。這種面向過程的開發方式使得程式層次清晰,便於使用、維護以及除錯。

C語言有許多的優點,但也有不少的缺點。總體來說,優點遠多於缺點,這裡不做討論。
值得注意的是,C語言面向過程的這一特點被認為是可以繼續完善的,因此在後來也誕生了面向物件的C++

三,C語言的組成

C語言的組成,不十分嚴謹的說,就是資料和程式兩個部分。我們在上面進行的開發就是如何寫出能夠良好處理資料的程式。這裡所說的資料,包括數字、符號,還包括一些從實際問題中抽象出來的資訊。

1.資料

C語言為開發人員提供了許多供選擇的資料型別,如int、short、long、unsigned、char、float、double、bool,還可以自己根據需求重新定義特有的資料型別,不同的資料型別有不同的特點,包括定義的方式、內部儲存的位數等,開發人員可以根據實際情況進行選擇。
但是,如果只對這些基本型別進行操作的話,是無法支撐我們現有美好生活的,你可能就無法現在坐在電腦前看到小編我寫的文章了。在實際應用中,我們往往需要處理大量的資料,這時需要關注的就不再是某一種資料型別,而是多種資料型別的組合,對它這一整體進行操作。
如果你是一名學過資料結構的程式設計愛好者,你就會知道,在基本的資料型別上,我們通過組合、拼接等等的方式定義瞭如線性表、陣列、佇列、棧、樹、圖等多種資料的構造形式,這些構造出來的形式我們稱之為資料結構。如果把資料結構比作一張網,那麼基礎資料型別就是網當中的結點。通常來說,我們處理的資料都會是資料結構中的某一類。

2.程式

對一個學者而言,日常飲食是生理食糧,而讀書則是精神食糧。如果我們將C語言比作一次豐盛的晚宴的話,那麼C語言的資料應該是餐桌上的美味佳餚,能否吃到固然很重要,但如何能高質量的享受它才是我們應有的追求。
為了能夠處理如此多型別的資料,C語言定義了許多類別的處理方式,包括了能進行資料之間互動的運算子、減少程式碼量的迴圈語句、控制程式執行的分支跳轉語句、面向人機互動的輸入輸出語句、機器內部的讀寫語句等。通過良好的運用這些語句,我們就能夠解決幾乎所有現在會遇到的問題。

說起程式,就不得不提函式這個概念了。函式是什麼?計算機當中所說的函式又是什麼?這個詞對於初學者而言會比較陌生。我們先回顧一下過去學習的數學知識,比如 f(x) = x^2 + x, 這顯然是一個二次函式,並且有一個一次項,當給f(x)中的x一個具體的數值的時候,會進行右側x^2 + x的計算得到結果,這個過程叫做賦值。在計算機當中也用到了賦值這種說法,不過從計算機函式的角度上來看,用引數傳遞會更顯專業。

在計算機內,函式也類似於數學公式那樣,完成特定的任務,比如你可以寫一個Sum()函式,表示做加法運算,你也可以寫一個Search()函式,表示尋找什麼東西,這些都是由開發人員自己定義的。對於有些函式而言,你只需要它執行即可,而對於有些函式,你需要提前給它一個值,它才能實現,如上面的二次函式,如果不給它一個確定的X值,那麼它就只表示一種數學關係。另外,還有的函式需要計算完畢之後返回值。

與數學當中的函式類似,計算機函式是這樣一個東西,它描述了一組動作或一種關係,它能夠接受外部的輸入(可能沒有),執行相應的動作,得到相應的結果(可能不返回)。事實上,C語言定義的所有語句都是函式,只不過它們是預先被寫入到C語言的庫當中,當我們需要使用時,只需要在庫中進行呼叫即可。如果你想成為一個合格的C的開發人員,一定要熟練的掌握C語言中各個函式的特點,在此基礎上進行拓展。

如果你既能夠將實際中的問題抽象化,變成我們有邏輯的資料結構,還能夠靈活的運用各類函式對他們進行處理,那麼恭喜你,在C語言開發方面,你已經入門了。

四,C預處理和C庫

1.C預處理

在前面,我們簡單的闡述了C語言的組成,它是由資料和程式構成的。其實,這種說法不太嚴謹,如果更細一些的話,應該說C主體部分或者說開發人員需要關注的部分,是由資料和程式構成的,還有一些部分是C語言設計者完成的,粗略的說就是預處理操作,當然,我們是可以根據實際情況重新定義預處理的方式的。

有一句俗話這樣說,磨刀不誤砍柴工,先將鐮刀磨快,這樣砍柴起來就很方便。可以這樣作比較,資料部分是柴火,程式是鐮刀,而預處理操作則是磨刀石。通過一些合理的預處理操作,將會使得你的程式開發事半功倍。

說起C預處理操作,相信瞭解過C語言的人會知道,在我們最開始寫“Hello World”這個程式時,我們在第一行會寫到
#incldue<stdio.h>

這個是什麼呢?這就是我們第一次會接觸到的預處理操作,#include表示將stdio.h這個標頭檔案加入到我們所寫程式的編譯環節之中,我們就能夠呼叫這個標頭檔案下的函式,這裡麵包括了輸入輸出等函式的定義,這是不是很方便?不需要自己寫,直接呼叫,簡直就是人家把麵包烤熟了我們直接拿來吃!!對一個程式設計人員來說,這是一種相當愜意的事情,不過小編還是不推薦大家在日常生活當中這麼偷懶了。

除了檔案包含預處理指令以外,還有一個很重要的概念,它叫做巨集。說起巨集,小編我就要說一些題外話了。我自己在C語言方面有巨集觀的瞭解,也仔細學過,但沒有到精通的級別。我曾經參加過電子設計大賽,參賽的時候借用了3D印表機內Marlin韌體的程式碼,在這個基礎上進行了一些特有函式的定義,順利完成了題目要求,也榮幸的獲得了一等獎的榮譽。不過我這裡不是強調獲獎,而是我所借用的Marlin韌體的程式碼,絕大部分都是用巨集來定義的!!!巨集是什麼?巨集是C語言內的一類重要預處理物件!!是極其強大的一種控制程式的手段。

例如你寫到
1 #ifndef XXX
2   #define XXX
3 #else
4   #define YYY
5 #endif

上面表達的是的是如果你沒有定義XXX,則定義XXX,否則定義YYY。這似乎和程式當中的判斷選擇有些類似,但你要明白,這不僅僅是一個定義那麼簡單,這是在所有程式執行之前進行的處理,可以理解為你吃飯之前要先拿筷子、刀叉一樣,就算你不喜歡用餐具,小編我想你總得用手吧!!!你可能有疑問,既然是預先處理,我自己確認自己都沒寫,用這條語句豈不是顯得多餘?其實並非如此,你要是寫個幾十行的程式碼,顯然很容易理清楚,但要是開發一個應用級別的軟體呢?需要寫數萬行的程式碼呢?你難道還得一個一個檔案的去找嗎?另外,通過這種巨集定義,你還能控制什麼函式執行,什麼函式不執行,如何跳轉,如何選擇。小編原來對這種巨集定義並不十分了解,覺得無非就是個提前定義個變數、函式什麼的,但自從看到Marlin韌體的程式碼之後,小編覺得自己真的是井底之蛙,在C語言的道路上還只是剛剛啟程。

2.C庫

前面我們提到,C的檔案包含預處理指令#include,那麼我們就必須要知道它包含了什麼內容,例如上面的stdio.h,就包含了輸入輸出等函式,另外還有許多庫供開發人員選擇,如string.h、math.h、stdlib.h等等,這些都是整合在開發平臺上面的,我們直接用就可以了。可以說,C語言的標頭檔案庫為我們省去了很多的麻煩,方便了我們進行開發和創造!!