C語(yǔ)言最初由 Dennis Ritchie 于 1969 年到 1973 年在 AT&T 貝爾實(shí)驗(yàn)室里開(kāi)發(fā)出來(lái),主要用于重新實(shí)現(xiàn) Unix 操作系統(tǒng)。此時(shí),C語(yǔ)言又被稱(chēng)為 K&R C。其中,K 表示 Kernighan 的首字母,而 R 則是 Ritchie 的首字母。

差異
K&R C語(yǔ)言與后來(lái)標(biāo)準(zhǔn)化的C語(yǔ)言有很大差異,比如:
- 如果函數(shù)返回類(lèi)型為 int,則 int 可省:
- int my_function(){ }
- 也可以寫(xiě)成
- my_function(){ }
- 編譯器不會(huì)有任何警告,更不會(huì)報(bào)錯(cuò)。
- 還有現(xiàn)在看來(lái)比較奇葩的函數(shù)定義,像我們現(xiàn)在定義這么一個(gè)函數(shù):
- void my_function(int a, char*p) {}
- 如果是用 K&R C 語(yǔ)法定義的話(huà)要寫(xiě)成:
- void my_function(a,p)int a; char*p; {}
- K&R 的C語(yǔ)法中,定義一個(gè)函數(shù)時(shí),其形參列表先列出形參的標(biāo)識(shí)符,然后在函數(shù)聲明的后面緊跟著對(duì)形參標(biāo)識(shí)符的完整聲明,最后是函數(shù)體。這在現(xiàn)行標(biāo)準(zhǔn)中已經(jīng)被逐步廢棄使用了。
另外,當(dāng)時(shí)的第一本C語(yǔ)言專(zhuān)業(yè)書(shū)《The C Programming Language》也并非一個(gè)正式的編程語(yǔ)言規(guī)范,但被用了許多年。
C90 標(biāo)準(zhǔn)
由于C語(yǔ)言被各大公司所使用(包括當(dāng)時(shí)處于鼎盛時(shí)期的 IBM PC),因此到了 1989 年,C語(yǔ)言由美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)進(jìn)行了標(biāo)準(zhǔn)化,此時(shí)C語(yǔ)言又被稱(chēng)為 ANSI C。
而僅過(guò)一年,ANSI C 就被國(guó)際標(biāo)準(zhǔn)化組織 ISO 給采納了。此時(shí),C語(yǔ)言在 ISO 中有了一個(gè)官方名稱(chēng)——ISO/IEC 9899: 1990。其中:
- 9899 是C語(yǔ)言在 ISO 標(biāo)準(zhǔn)中的代號(hào),像 C++ 在 ISO 標(biāo)準(zhǔn)中的代號(hào)是 14882;
- 而冒號(hào)后面的 1990 表示當(dāng)前修訂好的版本是在 1990 年發(fā)布的。
對(duì) 于ISO/IEC 9899: 1990 的俗稱(chēng)或簡(jiǎn)稱(chēng),有些地方稱(chēng)為 C89,有些地方稱(chēng)為 C90,或者 C89/90。不管怎么稱(chēng)呼,它們都指代這個(gè)最初的C語(yǔ)言國(guó)際標(biāo)準(zhǔn)。
這個(gè)版本的C語(yǔ)言標(biāo)準(zhǔn)作為 K&R C 的一個(gè)超集(即 K&R C 是此標(biāo)準(zhǔn)C的一個(gè)子集),把后來(lái)引入的許多非官方特性也一起整合了進(jìn)去。其中包括了從 C++ 借鑒的函數(shù)原型(Function Prototypes),指向 void 的指針,對(duì)國(guó)際字符集以及本地語(yǔ)言環(huán)境的支持。在此標(biāo)準(zhǔn)中,盡管已經(jīng)將函數(shù)定義的方式改為現(xiàn)在我們常用的那種方式,不過(guò)K&R的語(yǔ)法形式仍然兼容。
C99標(biāo)準(zhǔn)
在隨后的幾年里,C語(yǔ)言的標(biāo)準(zhǔn)化委員會(huì)又不斷地對(duì)C語(yǔ)言進(jìn)行改進(jìn),到了 1999 年,正式發(fā)布了 ISO/IEC 9899: 1999,簡(jiǎn)稱(chēng)為 C99 標(biāo)準(zhǔn)。
C99 標(biāo)準(zhǔn)引入了許多特性,包括內(nèi)聯(lián)函數(shù)(inline functions)、可變長(zhǎng)度的數(shù)組、靈活的數(shù)組成員(用于結(jié)構(gòu)體)、復(fù)合字面量、指定成員的初始化器、對(duì)IEEE754浮點(diǎn)數(shù)的改進(jìn)、支持不定參數(shù)個(gè)數(shù)的宏定義,在數(shù)據(jù)類(lèi)型上還增加了 long long int 以及復(fù)數(shù)類(lèi)型。
毫不夸張地說(shuō),即便到目前為止,很少有C語(yǔ)言編譯器是完整支持 C99 的。像主流的 GCC 以及 Clang 編譯器都能支持高達(dá)90%以上,而微軟的 Visual Studio 2015 中的C編譯器只能支持到 70% 左右。
C11標(biāo)準(zhǔn)
2007 年,C語(yǔ)言標(biāo)準(zhǔn)委員會(huì)又重新開(kāi)始修訂C語(yǔ)言,到了 2011 年正式發(fā)布了 ISO/IEC 9899: 2011,簡(jiǎn)稱(chēng)為 C11 標(biāo)準(zhǔn)。
C11標(biāo)準(zhǔn)新引入的特征盡管沒(méi) C99 相對(duì) C90 引入的那么多,但是這些也都十分有用,比如:字節(jié)對(duì)齊說(shuō)明符、泛型機(jī)制(generic selection)、對(duì)多線(xiàn)程的支持、靜態(tài)斷言、原子操作以及對(duì) Unicode 的支持。