搜索
熱搜: 活動 交友 discuz
查看: 2857|回復: 0
打印 上一主題 下一主題

[教學] C語言的歷史

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-9-4 08:54:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
[編輯] 早期發展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 函數
  • 函數返回 structunion 類型
  • void * 資料類型
在 ANSI 標準化自己的過程中,一些新的特性被加了進去。ANSI 也規定一套了標準函數庫。ANSI ISO國際標準化組織)成立 ISO/IEC JTC1/SC22/WG14 工作組、來規定國際標準的 C 語言。通過對 ANSI 標準的少量修改,最終通過了 ISO 9899:1990。隨後、ISO 標準被 ANSI 採納。
傳統 C 語言 到 ANSI/ISO 標準 C 語言 的改進包括:
  • 增加了真正的標準庫
  • 新的預處理命令與特性
  • 函數原型允許在函數申明中指定參數類型
  • 一些新的關鍵字,包括 constvolatilesigned
  • 寬字元、寬字元串與位元組多字元
  • 對約定規則、聲明和類型檢查的許多小改動與澄清

[編輯] 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 = 34、.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卻似乎對此不感興趣。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2026-6-4 10:35 , Processed in 0.031049 second(s), 17 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表