C語言是一門面向過程的計算機(jī)編程語言,與C++、C#、Java等面向?qū)ο缶幊陶Z言有所不同。C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、僅產(chǎn)生少量的機(jī)器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。C語言描述問題比匯編語言迅速、工作量小、可讀性好、易于調(diào)試、修改和移植,而代碼質(zhì)量與匯編語言相當(dāng)。C語言一般只比匯編語言代碼生成的目標(biāo)程序效率低10%-20%。因此,C語言可以編寫系統(tǒng)軟件。
當(dāng)前階段,在編程領(lǐng)域中,C語言的運用非常之多,它兼顧了高級語言和匯編語言的優(yōu)點,相較于其它編程語言具有較大優(yōu)勢。計算機(jī)系統(tǒng)設(shè)計以及應(yīng)用程序編寫是C語言應(yīng)用的兩大領(lǐng)域。同時,C語言的普適較強,在許多計算機(jī)操作系統(tǒng)中都能夠得到適用,且效率顯著。
C語言擁有經(jīng)過了漫長發(fā)展歷史的完整的理論體系,在編程語言中具有舉足輕重的地位。
C語言誕生于美國的貝爾實驗室,由丹尼斯·里奇(Dennis MacAlistair Ritchie)以肯尼斯·藍(lán)·湯普森(Kenneth Lane Thompson)設(shè)計的B語言為基礎(chǔ)發(fā)展而來,在它的主體設(shè)計完成后,湯普森和里奇用它完全重寫了UNIX,且隨著UNIX的發(fā)展,c語言也得到了不斷的完善。為了利于C語言的全面推廣,許多專家學(xué)者和硬件廠商聯(lián)合組成了C語言標(biāo)準(zhǔn)委員會,并在之后的1989年,誕生了第一個完備的C標(biāo)準(zhǔn),簡稱“C89”,也就是“ANSI C”,截至2020年,最新的C語言標(biāo)準(zhǔn)為2018年6月發(fā)布的“C18”。
C語言之所以命名為C,是因為C語言源自Ken Thompson發(fā)明的B語言,而B語言則源自BCPL語言。
1967年,劍橋大學(xué)的Martin Richards對CPL語言進(jìn)行了簡化,于是產(chǎn)生了BCPL(Basic Combined Programming Language)語言。
20世紀(jì)60年代,美國AT&T公司貝爾實驗室(AT&T Bell Laboratories)的研究員肯·湯普森(Kenneth Lane Thompson)閑來無事,手癢難耐,想玩一個他自己編的,模擬在太陽系航行的電子游戲——Space Travel。他背著老板,找到了臺空閑的小型計算機(jī)——PDP-7。但這臺電腦沒有操作系統(tǒng),而游戲必須使用操作系統(tǒng)的一些功能,于是他著手為PDP-7開發(fā)操作系統(tǒng)。后來,這個操作系統(tǒng)被命名為——UNICS(Uniplexed Information and Computing Service)。
1969年,美國貝爾實驗室的Ken Thompson,以BCPL語言為基礎(chǔ),設(shè)計出很簡單且很接近硬件的B語言(取BCPL的首字母),并且用B語言寫了初版UNIX操作系統(tǒng)(叫UNICS)。
1971年,同樣酷愛Space Travel的丹尼斯·里奇為了能早點兒玩上游戲,加入了湯普森的開發(fā)項目,合作開發(fā)UNIX。他的主要工作是改造B語言,使其更成熟。
1972年,美國貝爾實驗室的丹尼斯·里奇在B語言的基礎(chǔ)上最終設(shè)計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。
1973年初,C語言的主體完成。湯普森和里奇迫不及待地開始用它完全重寫了UNIX。此時,編程的樂趣使他們已經(jīng)完全忘記了那個“Space Travel”,一門心思地投入到了UNIX和C語言的開發(fā)中。隨著UNIX的發(fā)展,C語言自身也在不斷地完善。直到2020年,各種版本的UNIX內(nèi)核和周邊工具仍然使用C語言作為最主要的開發(fā)語言,其中還有不少繼承湯普遜和里奇之手的代碼。
在開發(fā)中,他們還考慮把UNIX移植到其他類型的計算機(jī)上使用。C語言強大的移植性(Portability)在此顯現(xiàn)。機(jī)器語言和匯編語言都不具有移植性,為x86開發(fā)的程序,不可能在Alpha、SPARC和ARM等機(jī)器上運行。而C語言程序則可以使用在任意架構(gòu)的處理器上,只要那種架構(gòu)的處理器具有對應(yīng)的C語言編譯器和庫,然后將C源代碼編譯、連接成目標(biāo)二進(jìn)制文件之后即可在哪種架構(gòu)的處理器運行。
1977年,丹尼斯·里奇發(fā)表了不依賴于具體機(jī)器系統(tǒng)的C語言編譯文本《可移植的C語言編譯程序》。
C語言繼續(xù)發(fā)展,在1982年,很多有識之士和美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)為了使C語言健康地發(fā)展下去,決定成立C標(biāo)準(zhǔn)委員會,建立C語言的標(biāo)準(zhǔn)。委員會由硬件廠商、編譯器及其他軟件工具生產(chǎn)商、軟件設(shè)計師、顧問、學(xué)術(shù)界人士、C語言作者和應(yīng)用程序員組成。1989年,ANSI發(fā)布了第一個完整的C語言標(biāo)準(zhǔn)——ANSI X3.159-1989,簡稱“C89”,不過人們也習(xí)慣稱其為“ANSI C”。C89在1990年被國際標(biāo)準(zhǔn)化組織(International Standard Organization,ISO)一字不改地采納,ISO官方給予的名稱為:ISO/IEC 9899,所以ISO/IEC9899:1990也通常被簡稱為“C90”。1999年,在做了一些必要的修正和完善后,ISO發(fā)布了新的C語言標(biāo)準(zhǔn),命名為ISO/IEC 9899:1999,簡稱“C99”。在2011年12月8日,ISO又正式發(fā)布了新的標(biāo)準(zhǔn),稱為ISO/IEC9899:2011,簡稱為“C11”。
數(shù)據(jù)類型
C的數(shù)據(jù)類型包括:整型(short、int、long、long long)、字符型(char)、實型或浮點型(單精度float和雙精度double)、枚舉類型(enum)、數(shù)組類型、結(jié)構(gòu)體類型(struct)、共用體類型(union)、指針類型和空類型(void)。
常量與變量
常量其值不可改變,符號常量名通常用大寫。
變量是以某標(biāo)識符為名字,其值可以改變的量。標(biāo)識符是以字母或下劃線開頭的一串由字母、數(shù)字或下劃線構(gòu)成的序列,請注意第一個字符必須為字母或下劃線,否則為不合法的變量名。變量在編譯時為其分配相應(yīng)存儲單元。
數(shù)組
如果一個變量名后面跟著一個有數(shù)字的中括號,這個聲明就是數(shù)組聲明。字符串也是一種數(shù)組。它們以ASCII的NULL作為數(shù)組的結(jié)束。要特別注意的是,中括號內(nèi)的索引值是從0算起的。
指針
如果一個變量聲明時在前面使用*號,表明這是個指針型變量。換句話說,該變量存儲一個地址,而*(此處特指單目運算符*,下同。C語言中另有雙目運算符*)則是取內(nèi)容操作符,意思是取這個內(nèi)存地址里存儲的內(nèi)容。指針是C語言區(qū)別于其他同時代高級語言的主要特征之一。
指針不僅可以是變量的地址,還可以是數(shù)組、數(shù)組元素、函數(shù)的地址。通過指針作為形式參數(shù)可以在函數(shù)的調(diào)用過程得到一個以上的返回值,不同于return(z)這樣的僅能得到一個返回值。
指針是一把雙刃劍,許多操作可以通過指針自然的表達(dá),但是不正確的或者過分的使用指針又會給程序帶來大量潛在的錯誤。
字符串
C語言的字符串其實就是以'