版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-c語言

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

C語言是一門面向過程、抽象化的通用程序設(shè)計(jì)語言,廣泛應(yīng)用于底層開發(fā)。C語言能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器。C語言是僅產(chǎn)生少量的機(jī)器語言以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的高效率程序設(shè)計(jì)語言。盡管C語言提供了許多低級(jí)處理的功能,但仍然保持著跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫出的C語言程序可在包括一些類似嵌入式處理器以及超級(jí)計(jì)算機(jī)等作業(yè)平臺(tái)的許多計(jì)算機(jī)平臺(tái)上進(jìn)行編譯。1

基本簡(jiǎn)介C語言是一門面向過程的計(jì)算機(jī)編程語言,與C++、Java等面向?qū)ο缶幊陶Z言有所不同。C語言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、僅產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言。C語言描述問題比匯編語言迅速,工作量小、可讀性好,易于調(diào)試、修改和移植,而代碼質(zhì)量與匯編語言相當(dāng)。C語言一般只比匯編語言代碼生成的目標(biāo)程序效率低10%~20%。因此,C語言可以編寫系統(tǒng)軟件。2

二十世紀(jì)八十年代,美國(guó)國(guó)家標(biāo)準(zhǔn)局為了避免各開發(fā)廠商用的C語言語法產(chǎn)生差異,給C語言制定了一套完整的美國(guó)國(guó)家標(biāo)準(zhǔn)語法,稱為ANSI C。作為C語言最初的標(biāo)準(zhǔn)。32011年12月8日,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)發(fā)布的C11標(biāo)準(zhǔn)是C語言的第三個(gè)官方標(biāo)準(zhǔn),也是C語言的最新標(biāo)準(zhǔn),該標(biāo)準(zhǔn)更好的支持了漢字函數(shù)名和漢字標(biāo)識(shí)符,一定程度上實(shí)現(xiàn)了漢字編程。

C語言編譯器普遍存在于各種不同的操作系統(tǒng)中,例如Microsoft Windows, Mac OS X, Linux, Unix等。C語言的設(shè)計(jì)影響了眾多后來的編程語言,例如C++、Objective-C、Java、C#等。

發(fā)展歷史C語言之所以命名為C,是因?yàn)?C語言源自Ken Thompson發(fā)明的B語言,而 B語言則源自BCPL語言。

1967年,劍橋大學(xué)的Martin Richards對(duì)CPL語言進(jìn)行了簡(jiǎn)化,于是產(chǎn)生了BCPL(Basic Combined Programming Language)語言。

20世紀(jì)60年代,美國(guó)AT&T公司貝爾實(shí)驗(yàn)室(AT&T Bell Laboratory)的研究員Ken Thompson閑來無事,手癢難耐,想玩一個(gè)他自己編的,模擬在太陽(yáng)系航行的電子游戲——Space Travel。他背著老板,找到了臺(tái)空閑的機(jī)器——PDP-7。但這臺(tái)機(jī)器沒有操作系統(tǒng),而游戲必須使用操作系統(tǒng)的一些功能,于是他著手為PDP-7開發(fā)操作系統(tǒng)。后來,這個(gè)操作系統(tǒng)被命名為——UNIX。

1970年,美國(guó)貝爾實(shí)驗(yàn)室的 Ken Thompson,以BCPL語言為基礎(chǔ),設(shè)計(jì)出很簡(jiǎn)單且很接近硬件的B語言(取BCPL的首字母)。并且他用B語言寫了第一個(gè)UNIX操作系統(tǒng)。

1971年,同樣酷愛Space Travel的Dennis M.Ritchie為了能早點(diǎn)兒玩上游戲,加入了Thompson的開發(fā)項(xiàng)目,合作開發(fā)UNIX。他的主要工作是改造B語言,使其更成熟。3

1972年,美國(guó)貝爾實(shí)驗(yàn)室的 D.M.Ritchie 在B語言的基礎(chǔ)上最終設(shè)計(jì)出了一種新的語言,他取了BCPL的第二個(gè)字母作為這種語言的名字,這就是C語言。

1973年初,C語言的主體完成。Thompson和Ritchie迫不及待地開始用它完全重寫了UNIX。此時(shí),編程的樂趣使他們已經(jīng)完全忘記了那個(gè)"Space Travel",一門心思地投入到了UNIX和C語言的開發(fā)中。隨著UNIX的發(fā)展,C語言自身也在不斷地完善。直到今天,各種版本的UNIX內(nèi)核和周邊工具仍然使用C語言作為最主要的開發(fā)語言,其中還有不少繼承Thompson和Ritchie之手的代碼。3

在開發(fā)中,他們還考慮把UNIX移植到其他類型的計(jì)算機(jī)上使用。C語言強(qiáng)大的移植性(Portability)在此顯現(xiàn)。機(jī)器語言和匯編語言都不具有移植性,為x86開發(fā)的程序,不可能在Alpha,SPARC和ARM等機(jī)器上運(yùn)行。而C語言程序則可以使用在任意架構(gòu)的處理器上,只要那種架構(gòu)的處理器具有對(duì)應(yīng)的C語言編譯器和庫(kù),然后將C源代碼編譯、連接成目標(biāo)二進(jìn)制文件之后即可運(yùn)行。3

1977年,Dennis M.Ritchie發(fā)表了不依賴于具體機(jī)器系統(tǒng)的C語言編譯文本《可移植的C語言編譯程序》。

C語言繼續(xù)發(fā)展,在1982年,很多有識(shí)之士和美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)為了使這個(gè)語言健康地發(fā)展下去,決定成立C標(biāo)準(zhǔn)委員會(huì),建立C語言的標(biāo)準(zhǔn)。委員會(huì)由硬件廠商,編譯器及其他軟件工具生產(chǎn)商,軟件設(shè)計(jì)師,顧問,學(xué)術(shù)界人士,C語言作者和應(yīng)用程序員組成。1989年,ANSI發(fā)布了第一個(gè)完整的C語言標(biāo)準(zhǔn)——ANSI X3.159—1989,簡(jiǎn)稱“C89”,不過人們也習(xí)慣稱其為“ANSI C”。C89在1990年被國(guó)際標(biāo)準(zhǔn)組織ISO(International Standard Organization)一字不改地采納,ISO官方給予的名稱為:ISO/IEC 9899,所以ISO/IEC9899: 1990也通常被簡(jiǎn)稱為“C90”。1999年,在做了一些必要的修正和完善后,ISO發(fā)布了新的C語言標(biāo)準(zhǔn),命名為ISO/IEC 9899:1999,簡(jiǎn)稱“C99”。3在2011年12月8日,ISO又正式發(fā)布了新的標(biāo)準(zhǔn),稱為ISO/IEC9899: 2011,簡(jiǎn)稱為“C11”。

編程開發(fā)編譯器GCC,GNU組織開發(fā)的開源免費(fèi)的編譯器

MinGW,Windows操作系統(tǒng)下的GCC

Clang,開源的BSD協(xié)議的基于LLVM的編譯器

Visual C++ :: cl.exe,Microsoft VC++自帶的編譯器

集成開發(fā)環(huán)境Code::Blocks,開源免費(fèi)的C/C++ IDE

CodeLite,開源、跨平臺(tái)的C/C++集成開發(fā)環(huán)境

Dev-C++,可移植的C/C++IDE

C-Free

Light Table

Visual Studio系列

第一個(gè)程序下面是一個(gè)在標(biāo)準(zhǔn)輸出設(shè)備 (stdout) 上,印出 "Hello, world!" 字符串的簡(jiǎn)單程序。類似的程序,通常作為初學(xué)編程語言時(shí)的第一個(gè)程序:

#include int main(void){ printf("Hello, World! \n"); return 0;}事例程序的第一行#include 是預(yù)處理器指令,告訴 C 編譯器在實(shí)際編譯之前要包含 stdio.h 文件。

下一行int main()是主函數(shù),程序從這里開始執(zhí)行。

下一行printf(...)是 C 中另一個(gè)可用的函數(shù),會(huì)在屏幕上顯示消息 "Hello, World!"。

下一行**return 0;**終止 main() 函數(shù),并返回值 0。1

語言標(biāo)準(zhǔn)起初,C語言沒有官方標(biāo)準(zhǔn)。1978年由美國(guó)電話電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語言。布萊恩·柯林漢(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本書,名叫《The C Programming Language》。這本書被 C語言開發(fā)者們稱為K&R,很多年來被當(dāng)作 C語言的非正式的標(biāo)準(zhǔn)說明。人們稱這個(gè)版本的 C語言為K&R C。

K&R C主要介紹了以下特色:

結(jié)構(gòu)體(struct)類型

長(zhǎng)整數(shù)(long int)類型

無符號(hào)整數(shù)(unsigned int)類型

把運(yùn)算符=+和=-改為+=和-=。因?yàn)?+和=-會(huì)使得編譯器不知道使用者要處理i = -10還是i =- 10,使得處理上產(chǎn)生混淆。

即使在后來ANSI C標(biāo)準(zhǔn)被提出的許多年后,K&R C仍然是許多編譯器的最 準(zhǔn)要求,許多老舊的編譯器仍然運(yùn)行K&R C的標(biāo)準(zhǔn)。

1970到80年代,C語言被廣泛應(yīng)用,從大型主機(jī)到小型微機(jī),也衍生了C語言的很多不同版本。

1983年,美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)成立了一個(gè)委員會(huì)X3J11,來制定 C語言標(biāo)準(zhǔn)。4

1989年,美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)通過了C語言標(biāo)準(zhǔn),被稱為ANSI X3.159-1989 "Programming Language C"。因?yàn)檫@個(gè)標(biāo)準(zhǔn)是1989年通過的,所以一般簡(jiǎn)稱C89標(biāo)準(zhǔn)。有些人也簡(jiǎn)稱ANSI C,因?yàn)檫@個(gè)標(biāo)準(zhǔn)是美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)發(fā)布的。

1990年,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)把C89標(biāo)準(zhǔn)定為C語言的國(guó)際標(biāo)準(zhǔn),命名為ISO/IEC 9899:1990 - Programming languages -- C。因?yàn)榇藰?biāo)準(zhǔn)是在1990年發(fā)布的,所以有些人把簡(jiǎn)稱作C90標(biāo)準(zhǔn)。不過大多數(shù)人依然稱之為C89標(biāo)準(zhǔn),因?yàn)榇藰?biāo)準(zhǔn)與ANSI C89標(biāo)準(zhǔn)完全等同。

1994年,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)發(fā)布了C89標(biāo)準(zhǔn)修訂版,名叫ISO/IEC 9899:1990/Cor 1:1994,有些人簡(jiǎn)稱為C94標(biāo)準(zhǔn)。

1995年,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)再次發(fā)布了C89標(biāo)準(zhǔn)修訂版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity,有些人簡(jiǎn)稱為C95標(biāo)準(zhǔn)

C99標(biāo)準(zhǔn)1999年1月,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)發(fā)布了C語言的新標(biāo)準(zhǔn),名叫ISO/IEC 9899:1999 - Programming languages -- C ,簡(jiǎn)稱C99標(biāo)準(zhǔn)。這是C語言的第二個(gè)官方標(biāo)準(zhǔn)。

在C99中包括的特性有:

增加了對(duì)編譯器的限制,比如源程序每行要求至少支持到 4095 字節(jié),變量名函數(shù)名的要求支持到 63 字節(jié)(extern 要求支持到 31)。

增強(qiáng)了預(yù)處理功能。例如:

宏支持取可變參數(shù) #define Macro(...) __VA_ARGS__

使用宏的時(shí)候,允許省略參數(shù),被省略的參數(shù)會(huì)被擴(kuò)展成空串。

支持 // 開頭的單行注釋(這個(gè)特性實(shí)際上在C89的很多編譯器上已經(jīng)被支持了)

增加了新關(guān)鍵字 restrict, inline, _Complex, _Imaginary, _Bool

支持 long long, long double _Complex, float _Complex 等類型

支持不定長(zhǎng)的數(shù)組,即數(shù)組長(zhǎng)度可以在運(yùn)行時(shí)決定,比如利用變量作為數(shù)組長(zhǎng)度。聲明時(shí)使用 int a[var] 的形式。不過考慮到效率和實(shí)現(xiàn),不定長(zhǎng)數(shù)組不能用在全局,或 struct 與 union 里。

變量聲明不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i2->1...循環(huán),2為循環(huán)條件。

while

while循環(huán)結(jié)構(gòu),while(1) 2; 的執(zhí)行順序是1->2->1...循環(huán),1為循環(huán)條件

以上循環(huán)語句,當(dāng)循環(huán)條件表達(dá)式為真則繼續(xù)循環(huán),為假則跳出循環(huán)。

程序結(jié)構(gòu)C語言的模塊化程序結(jié)構(gòu)用函數(shù)來實(shí)現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個(gè)模塊都編寫成一個(gè)C函數(shù),然后通過主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來實(shí)現(xiàn)一大型問題的C程序編寫,因此常說:C程序=主函數(shù)+子函數(shù)。因此,對(duì)函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過上機(jī)調(diào)試加以鞏固。

判斷語句(選擇結(jié)構(gòu)):

if 語句:“如果”語句;if—else 語句:“若…(則)…否則…”語句;switch 語句:“切換”語句;switch—case:“切換—情況”語句。

循環(huán)語句(循環(huán)結(jié)構(gòu)):

while 語句:“當(dāng)…”語句;do—while 語句:“做…當(dāng)…(時(shí)候)”語句;for 語句:條件語句(即“(做)…為了…”語句)。

跳轉(zhuǎn)語句(循環(huán)結(jié)構(gòu):是否循環(huán)):

goto 語句:“轉(zhuǎn)舵”語句,也稱“跳轉(zhuǎn)”語句;break 語句:“中斷”(循環(huán))語句,即結(jié)束整個(gè)循環(huán);continue 語句:“繼續(xù)”語句(結(jié)束本次循環(huán),繼續(xù)下一次循環(huán));return 語句:“返回”語句。

需要說明的是:

1、一個(gè)C語言源程序可以由一個(gè)或多個(gè)源文件組成。

2、每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成。

3、一個(gè)源程序不論由多少個(gè)文件組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù)。是整個(gè)程序的入口。3

4、源程序中可以有預(yù)處理命令(包括include 命令,ifdef、ifndef命令、define命令),預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。

5、每一個(gè)說明,每一個(gè)語句都必須以分號(hào)結(jié)尾。但預(yù)處理命令,函數(shù)頭和花括號(hào)“}”之后不能加分號(hào)。(結(jié)構(gòu)體、聯(lián)合體、枚舉型的聲明的“}”后要加“ ;”。)

6、標(biāo)識(shí)符,關(guān)鍵字之間必須至少加一個(gè)空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。

書寫規(guī)則

1、一個(gè)說明或一個(gè)語句占一行。

2、用{} 括起來的部分,通常表示了程序的某一層次結(jié)構(gòu)。{}一般與該結(jié)構(gòu)語句的第一個(gè)字母對(duì)齊,并單獨(dú)占一行。

3、低一層次的語句或說明可比高一層次的語句或說明縮進(jìn)若干格后書寫。以便看起來更加清晰,增加程序的可讀性。在編程時(shí)應(yīng)力求遵循這些規(guī)則,以養(yǎng)成良好的編程風(fēng)格。

函數(shù)C程序是由一組變量或是函數(shù)的外部對(duì)象組成的。 函數(shù)是一個(gè)自我包含的完成一定相關(guān)功能的執(zhí)行代碼段。我們可以把函數(shù)看成一個(gè)“黑盒子”,你只要將數(shù)據(jù)送進(jìn)去就能得到結(jié)果,而函數(shù)內(nèi)部究竟是如何工作的,外部程序是不知道的。外部程序所知道的僅限于輸入給函數(shù)什么以及函數(shù)輸出什么。函數(shù)提供了編制程序的手段,使之容易讀、寫、理解、排除錯(cuò)誤、修改和維護(hù)。

C程序中函數(shù)的數(shù)目實(shí)際上是不限的,如果說有什么限制的話,那就是,一個(gè)C程序中必須至少有一個(gè)函數(shù),而且其中必須有一個(gè)并且僅有一個(gè)以main為名,這個(gè)函數(shù)稱為主函數(shù),整個(gè)程序從這個(gè)主函數(shù)開始執(zhí)行。

C 語言程序鼓勵(lì)和提倡人們把一個(gè)大問題劃分成一個(gè)個(gè)子問題,對(duì)應(yīng)于解決一個(gè)子問題編制一個(gè)函數(shù),因此,C 語言程序一般是由大量的小函數(shù)而不是由少量大函數(shù)構(gòu)成的,即所謂“小函數(shù)構(gòu)成大程序”。這樣的好處是讓各部分相互充分獨(dú)立,并且任務(wù)單一。因而這些充分獨(dú)立的小模塊也可以作為一種固定規(guī)格的小“構(gòu)件”, 用來構(gòu)成新的大程序。

C語言發(fā)展的那么多年來,用C語言開發(fā)的系統(tǒng)和程序浩如煙海。在發(fā)展的同時(shí)也積累了很多能直接使用的庫(kù)函數(shù)。

ANSI C提供了標(biāo)準(zhǔn)C語言庫(kù)函數(shù)。

C語言初學(xué)者比較喜歡的Turbo C 2.0提供了400多個(gè)運(yùn)行時(shí)函數(shù),每個(gè)函數(shù)都完成特定的功能,用戶可隨意調(diào)用。這些函數(shù)總體分成輸入輸出函數(shù)、數(shù)學(xué)函數(shù)、字符串和內(nèi)存函數(shù)、與BIOS和DOS有關(guān)的函數(shù)、 字符屏幕和圖形功能函數(shù)、過程控制函數(shù)、目錄函數(shù)等。

Windows系統(tǒng)所提供的Windows SDK中包含了數(shù)千個(gè)跟Windows應(yīng)用程序開發(fā)相關(guān)的函數(shù)。

其他操作系統(tǒng),如Linux,也同樣提供了大量的函數(shù)讓應(yīng)用程序開發(fā)人員調(diào)用。

作為程序員應(yīng)盡量熟悉目標(biāo)平臺(tái)庫(kù)函數(shù)其功能。這樣才能游刃有余地開發(fā)特定平臺(tái)的應(yīng)用程序。比如作為Windows應(yīng)用程序的開發(fā)者,應(yīng)盡量熟悉Windows SDK;作為L(zhǎng)inux應(yīng)用程序開發(fā)者,應(yīng)盡量熟悉Linux系統(tǒng)調(diào)用和POSIX函數(shù)規(guī)范。1

運(yùn)算符號(hào)比較特別的是,比特右移(>>)運(yùn)算符可以是算術(shù)(左端補(bǔ)最高有效位)或是邏輯(左端補(bǔ) 0)位移。例如,將 11100011 右移 3 比特,算術(shù)右移后成為 11111100,邏輯右移則為 00011100。因算術(shù)比特右移較適于處理帶負(fù)號(hào)整數(shù),所以幾乎所有的編譯器都是算術(shù)比特右移。

運(yùn)算符的優(yōu)先級(jí)從高到低大致是:?jiǎn)文窟\(yùn)算符、算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、條件運(yùn)算符、賦值運(yùn)算符(=)和逗號(hào)運(yùn)算符。

|| ||

經(jīng)典錯(cuò)誤void main()的用法并不是任何標(biāo)準(zhǔn)制定的。 C語言標(biāo)準(zhǔn)語法是int main,任何實(shí)現(xiàn)都必須支持int main(void) { /* ... */ }和int main(int argc, char* argv[]) { /* ... */ }。

類似于a+=a++;或者(i++)+(i++)+(i++)屬于未定義行為,并不是說c語言中還未定義這種行為,它早有定論,它的結(jié)果取決于編譯器實(shí)現(xiàn),不要寫這樣的代碼!

本詞條內(nèi)容貢獻(xiàn)者為:

徐恒山 - 講師 - 西北農(nóng)林科技大學(xué)