C語言最初由 Dennis Ritchie 于 1969 年到 1973 年在 AT&T 貝爾實驗室里開發出來,主要用于重新實現 Unix 操作系統。此時,C語言又被稱為 K&R C。其中,K 表示 Kernighan 的首字母,而 R 則是 Ritchie 的首字母。

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