C語言是中級語言
C語言通常稱為中級計算機(jī)語言。中級語言并沒有貶義,不意味著它功能差、難以使用、或者比B A S I C、P a s c a l那樣的高級語言原始,也不意味著它與匯編語言相似,會給使用者帶來類似的麻煩。C語言之所以被稱為中級語言,是因為它把高級語言的成分同匯編語言的功能結(jié)合起來了。表1 – 1表明了C語言在計算機(jī)語言中所處的地位。
作為中級語言,C允許對位、字節(jié)和地址這些計算機(jī)功能中的基本成分進(jìn)行操作。C語言程序非常容易移植??梢浦残员硎緸槟撤N計算機(jī)寫的軟件可以用到另一種機(jī)器上去。舉例來說,如果為蘋果機(jī)寫的一個程序能夠方便地改為可以在IBM PC 上運行的程序,則稱為是可移植的。
所有的高級語言都支持?jǐn)?shù)據(jù)類型的概念。一個數(shù)據(jù)類型定義了一個變量的取值范圍和可在其上操作的一組運算。常見的數(shù)據(jù)類型是整型、字符型和實數(shù)型。雖然C語言有五種基本數(shù)據(jù)類型,但與P a s c a l或A d a相比,它卻不是強(qiáng)類型語言。C程序允許幾乎所有的類型轉(zhuǎn)換。例如,字符型和整型數(shù)據(jù)能夠自由地混合在大多數(shù)表達(dá)式中進(jìn)行運算。這在強(qiáng)類型高級語言中是不允許的。
C語言的另一個重要特點是它僅有3 2個關(guān)鍵字,這些關(guān)鍵字就是構(gòu)成C語言的命令。和IBM PC的B A S I C相比,后者包含的關(guān)鍵字達(dá)1 5 9個之多。
C語言是結(jié)構(gòu)化語言
雖然從嚴(yán)格的學(xué)術(shù)觀點上看,C語言是塊結(jié)構(gòu)(b l o c k – s t r u c t u r e d)語言,但是它還是常被稱為結(jié)構(gòu)化語言。這是因為它在結(jié)構(gòu)上類似于A L G O L、P a s c a l和M o d u l a – 2(從技術(shù)上講,塊結(jié)構(gòu)語言允許在過程和函數(shù)中定義過程或函數(shù)。用這種方法,全局和局部的概念可以通過“作用域”規(guī)則加以擴(kuò)展,“作用域”管理變量和過程的“可見性”。因為C語言不允許在函數(shù)中定義函數(shù),所以不能稱之為通常意義上的塊結(jié)構(gòu)語言)。
結(jié)構(gòu)化語言的顯著特征是代碼和數(shù)據(jù)的分離。這種語言能夠把執(zhí)行某個特殊任務(wù)的指令和數(shù)據(jù)從程序的其余部分分離出去、隱藏起來。獲得隔離的一個方法是調(diào)用使用局部(臨時)變量的子程序。通過使用局部變量,我們能夠?qū)懗鰧Τ绦蚱渌糠譀]有副作用的子程序。這使得編寫共享代碼段的程序變得十分簡單。如果開發(fā)了一些分離很好的函數(shù),在引用時我們僅需要知道函數(shù)做什么,不必知道它如何做。切記:過度使用全局變量(可以被全部程序訪問的變量)會由于意外的副作用而在程序中引入錯誤。
結(jié)構(gòu)化語言比非結(jié)構(gòu)化語言更易于程序設(shè)計,用結(jié)構(gòu)化語言編寫的程序的清晰性使得它們更易于維護(hù)。這已是人們普遍接受的觀點了。C語言的主要結(jié)構(gòu)成分是函數(shù)C的獨立子程序。
在C語言中,函數(shù)是一種構(gòu)件(程序塊),是完成程序功能的基本構(gòu)件。函數(shù)允許一個程序的諸任務(wù)被分別定義和編碼,使程序模塊化??梢源_信,一個好的函數(shù)不僅能正確工作且不會對程序的其它部分產(chǎn)生副作用。
1.2.3 C語言是程序員的語言
也許你會問“所有的計算機(jī)語言不都是程序員使用的嗎?”,回答是斷然的“否”。我們考慮典型的非程序員的語言C O B O L和B A S I C。C O B O L的設(shè)計使程序員難以改變所編寫代碼的可靠性,甚至不能提高代碼的編寫速度。
然而C O B O L設(shè)計者的本意卻是打算使非程序員能讀程序(這是不大可能的事)。注意,這并不是攻擊C O B O L的優(yōu)點,而是想指出,它沒有被設(shè)計成為程序員的理想語言。BASIC 的主要目的是允許非專業(yè)程序員在計算機(jī)上編程解決比較簡單的問題。與其形成鮮明對照的是C 語言,由于程序生成、修改和現(xiàn)場測試自始至終均由真正的程序員進(jìn)行,因而它實現(xiàn)了程序員的期望:很少限制、很少強(qiáng)求、塊結(jié)構(gòu)、獨立的函數(shù)以及緊湊的關(guān)鍵字集合。用C語言編程,程序員可以獲得高效機(jī)器代碼,其效率幾乎接近匯編語言代碼。
C語言被程序員廣泛使用的另一個原因是可以用它代替匯編語言。匯編語言使用的匯編指令,是能夠在計算機(jī)上直接執(zhí)行的二進(jìn)制機(jī)器碼的符號表示。匯編語言的每個操作都對應(yīng)為計算機(jī)執(zhí)行的單一指令。雖然匯編語言給予程序員達(dá)到最大靈活性和最高效率的潛力,但開發(fā)和調(diào)試匯編語言程序的困難是難以忍受的。非結(jié)構(gòu)性使得匯編語言程序難于閱讀、改進(jìn)和維護(hù)。也許更重要的是,匯編語言程序不能在使用不同C P U的機(jī)器間移植。
最初,C語言被用于系統(tǒng)程序設(shè)計。一個“系統(tǒng)程序”是一大類程序的一部分,這一大類構(gòu)成了計算機(jī)操作系統(tǒng)及實用程序。通常被稱為系統(tǒng)程序的有:
? 操作系統(tǒng)。
? 翻譯程序。
? 編輯程序。
? 匯編程序。
? 編譯程序。
? 數(shù)據(jù)庫管理程序。
隨著C語言的普及,加之其可移植性和高效率,許多程序員用它設(shè)計各類程序。幾乎所有的計算機(jī)上都有C語言編譯程序,這使我們可以很少改動甚至不加改動地將為一種機(jī)器寫的C 語言源程序在另一種機(jī)器上編譯執(zhí)行??梢浦残怨?jié)省了時間和財力。
C語言不僅在速度和結(jié)構(gòu)上有它的優(yōu)勢,而且每個C語言系統(tǒng)都提供了專門的函數(shù)庫,程序員可以根據(jù)不同需要對其進(jìn)行剪裁,以適應(yīng)各種程序的設(shè)計。由于它允許(更準(zhǔn)確地說是鼓勵)分別編譯,所以C語言可使程序員方便地管理大型項目,最大限度地減少重復(fù)勞動。