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