C語言的歷史



早期發展C語言的第一次發展在1969年到1973年之間。之所以被稱為「C」是因為C語言的很多特性是由一種更早的被稱為B語言的程式語言中發展而來。早期作業系統的核心大多由組合語言組成,隨著C語言的發展,C語言已經可以用來編寫作業系統的核心。1973年,Unix作業系統的核心正式用C語言改寫,這是C語言第一次應用在作業系統的核心編寫上。


K&R C1978年,丹尼斯·裡奇(Dennis Ritchie)和Brian Kernighan合作出版了《C程式語言》的第一版。書中介紹的C語言標準也被C語言程式設計師稱作「K&R C」,第二版的書中也包含了一些ANSI C的標準。K&R C主要介紹了以下特色:


結構(struct)類型
長整數(long int)類型
無號整數(unsigned int)類型
把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道使用者要處理i = +10還是i =+ 10,使得處理上產生混淆。
即使在後來ANSI C標準被提出的許多年後,K&R C仍然是許多編譯器的最低標準要求,許多老舊的編譯仍然運行K&R C的標準。


ANSI C 和 ISO C(1985年)1989 年,C 語言被 ANSI 標準化(ANSI X3.159-1989)。標準化的一個目的是擴展 K&R C。這個標準包括了一些新特性。在 K&R 出版後,一些新特性被非官方的加到 C 語言中。


void 函數
函數返回 struct 或 union 類型
void * 資料類型
在 ANSI 標準化自己的過程中,一些新的特性被加了進去。ANSI 也規定一套了標準函數庫。ANSI ISO(國際標準化組織)成立 ISO/IEC JTC1/SC22/WG14 工作組、來規定國際標準的 C 語言。通過對 ANSI 標準的少量修改,最終通過了 ISO 9899:1990。隨後、ISO 標準被 ANSI 採納。
傳統 C 語言 到 ANSI/ISO 標準 C 語言 的改進包括:


增加了真正的標準庫
新的預處理命令與特性
函數原型允許在函數申明中指定參數類型
一些新的關鍵字,包括 const、volatile 與 signed
寬字元、寬字元串與位元組多字元
對約定規則、聲明和類型檢查的許多小改動與澄清


ANSI C 和 ISO C(1995年)作為對標準的維護與更新,WG14 工作小組在 1995年、對 1985 年頒布的標準做了兩處技術修訂(缺陷修復)和一個補充(擴展)。下面是 1995 年做出的所有修改:


3 個新的標準庫頭檔案 iso646.h、wctype.h 和 wchar.h
幾個新的記號與預定義宏,用於對國際化提供更好的支援
printf/sprintf 函數一系列新的格式代碼
大量的函數和一些類型與常數,用於多位元組字元和寬位元組字元


C99perra! jorge es una perra miguel tambien paco!!......tu mama es hombre及的C99。它被ANSI於2000年三月採用。
在C99中包括的特性有:


對編譯器限制增加了,比如源程序每行要求至少支援到 4095 位元組,變數名函數名的要求支援到 63 位元組 (extern 要求支援到 31)
預處理增強了。例如:
宏支援取參數 #define Macro(...) __VA_ARGS__
使用宏的時候,參數如果不寫,宏裡用 #,## 這樣的東西會擴展成空串。(以前會出錯的)
支援 // 行註釋(這個特性實際上在C89的很多編譯器上已經被支援了)
增加了新關鍵字 restrict、inline、_Complex、_Imaginary、_Bool
支援 long long、long double _Complex、float _Complex 這樣的類型
支援 <: :> <% %> %: %:%: ,等等奇怪的符號替代,D&E 裡提過這個
支援了不定長的數組。數組的長度就可以用變數了。聲明類型的時候呢,就用 int a
這樣的寫法。不過考慮到效率和實現,這玩意並不是一個新類型。所以就不能用在全局裡,或者 struct union 裡面,如果你用了這樣的東西,goto 語句就受限制了。
變數聲明不必放在語句塊的開頭,for 語句提倡這麼寫 for(int i=0;i<100;++i) 就是說,int i 的聲明放在裡面,i 只在 for 裡面有效。
當一個類似結構的東西需要臨時構造的時候,可以用 (type_name){xx,xx,xx} 這有點像 C++ 的構造函數
初始化結構的時候現在可以這樣寫: struct {int a[3]、b;} hehe[] =  { [0].a = {1}、[1].a = 2 };
struct {int a、b、c、d;} hehe =  { .a = 1、.c = 3、4、.b = 5}  // 3,4 是對 .c,.d 賦值的
字元串裡面,\u 支援 unicode 的字元
支援 16 進位的浮點數的描述
所以 printf scanf 的格式化串多支援了 ll / LL (VC6 裡用的 I64) 對應新的 long long 類型。
浮點數的內部資料描述支援了新標準,這個可以用 #pragma 編譯器指定
除了已經有的 __line__ __file__ 以外,又支援了一個 __func__ 可以得到當前的函數名
對於非常數的表達式,也允許編譯器做化簡
修改了對於 / % 處理負數上的定義,比如老的標準裡 -22 / 7 = -3、-22 % 7 = -1 而現在 -22 / 7 = -4、-22 % 7 = 6
取消了不寫函數返回類型預設就是 int 的規定
允許 struct 定義的最後一個數組寫做 [] 不指定其長度描述
const const int i; 將被當作 const int i; 處理
增加和修改了一些標準頭檔案、比如定義 bool 的 <stdbool.h> 定義一些標準長度的 int 的 <inttypes.h> 定義複數的 <complex.h> 定義寬字元的 <wctype.h> 有點泛型味道的數學函數 <tgmath.h> 跟浮點數有關的 <fenv.h>。<stdarg.h> 裡多了一個 va_copy 可以複製 ... 的參數。<time.h> 裡多了個 struct tmx 對 struct tm 做了擴展
輸入輸出對寬字元還有長整數等做了相應的支援
但是各個公司對C99的支援所表現出來的興趣不同。當GCC和其它一些商業編譯器支援C99的大部分特性的時候,微軟和Borland卻似乎對此不感興趣。

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()