- 論壇徽章:
- 0
|
設(shè)計(jì)哲學(xué)
C語(yǔ)言是一個(gè)
程序語(yǔ)言
,設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的
機(jī)器碼
以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。C語(yǔ)言也很適合搭配
匯編語(yǔ)言
來(lái)使用。盡管C語(yǔ)言提供了許多低級(jí)處理的功能,但仍然保持著良好
跨平臺(tái)
的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫出的C語(yǔ)言程序可在許多計(jì)算機(jī)平臺(tái)上進(jìn)行編譯,甚至包含一些嵌入式處理器(
微控制器
或稱MCU)以及
超級(jí)計(jì)算機(jī)
等作業(yè)平臺(tái)。
特色
C語(yǔ)言是一個(gè)有結(jié)構(gòu)化程序設(shè)計(jì)、具有變量作用域(variable scope)以及遞歸功能的過(guò)程式語(yǔ)言。傳遞參數(shù)是以值傳遞(Pass-by-value),也可以通過(guò)指針來(lái)傳遞參數(shù)(Pass-by-address)。不同的變量類型可以用結(jié)構(gòu)體(struct)組合在一起。只有32個(gè)保留字(reserved keywords),使變量、函數(shù)命名有更多彈性。部份的變量類型可以轉(zhuǎn)換,例如整形和字符變量。通過(guò)指針(pointer),C語(yǔ)言可以容易的對(duì)存儲(chǔ)器進(jìn)行低級(jí)控制。編譯預(yù)處理(preprocessor)讓C語(yǔ)言的編譯更具有彈性。
歷史
早期發(fā)展
C語(yǔ)言的第一次發(fā)展在1969年到1973年之間。之所以被稱為“C”是因?yàn)镃語(yǔ)言的很多特性是由一種更早的被稱為
B語(yǔ)言
的編程語(yǔ)言中發(fā)展而來(lái)。早期操作系統(tǒng)的內(nèi)核大多由
匯編語(yǔ)言
組成,隨著C語(yǔ)言的發(fā)展,C語(yǔ)言已經(jīng)可以用來(lái)編寫操作系統(tǒng)的內(nèi)核。
1973年
,
Unix
操作系統(tǒng)
的
內(nèi)核
正式用C語(yǔ)言改寫,這是C語(yǔ)言第一次應(yīng)用在操作系統(tǒng)的內(nèi)核編寫上。
K&R C
1978年
,丹尼斯·里奇(Dennis Ritchie)和Brian Kernighan合作出版了《
C程序設(shè)計(jì)語(yǔ)言
》的第一版。書中介紹的C語(yǔ)言標(biāo)準(zhǔn)也被C語(yǔ)言程序設(shè)計(jì)師稱作“K&R C”,第二版的書中也包含了一些ANSI C的標(biāo)準(zhǔn)。K&R C主要介紹了以下特色:
結(jié)構(gòu)(struct)類型長(zhǎng)整數(shù)(long int)類型無(wú)符號(hào)整數(shù)(unsigned int)類型把運(yùn)算符=+和=-改為+=和-=。因?yàn)?+和=-會(huì)使得編譯器不知道用戶要處理i = +10還是i =- 10,使得處理上產(chǎn)生混淆。
即使在后來(lái)ANSI C標(biāo)準(zhǔn)被提出的許多年后,K&R C仍然是許多編譯器的最低標(biāo)準(zhǔn)要求,許多老舊的編譯仍然運(yùn)行K&R C的標(biāo)準(zhǔn)。
ANSI C 和 ISO C
主條目:
ANSI C
1989年,C語(yǔ)言被 ANSI 標(biāo)準(zhǔn)化(ANSI X3.159-1989)。標(biāo)準(zhǔn)化的一個(gè)目的是擴(kuò)展K&R C。這個(gè)標(biāo)準(zhǔn)包括了一些新特性。在K&R出版后,一些新特性被
非官方
地加到C語(yǔ)言中。
void 函數(shù)函數(shù)返回 struct 或 union 類型void * 數(shù)據(jù)類型
在ANSI標(biāo)準(zhǔn)化自己的過(guò)程中,一些新的特性被加了進(jìn)去。ANSI也規(guī)定一套了標(biāo)準(zhǔn)函數(shù)庫(kù)。ANSI
ISO
(
國(guó)際標(biāo)準(zhǔn)化組織
)成立 ISO/IEC JTC1/SC22/WG14 工作組,來(lái)規(guī)定國(guó)際標(biāo)準(zhǔn)的C語(yǔ)言。通過(guò)對(duì)ANSI標(biāo)準(zhǔn)的少量修改,最終通過(guò)了 ISO 9899:1990。隨后,ISO標(biāo)準(zhǔn)被 ANSI 采納。
傳統(tǒng)C語(yǔ)言到ANSI/ISO標(biāo)準(zhǔn)C語(yǔ)言的改進(jìn)包括:
增加了真正的標(biāo)準(zhǔn)庫(kù)新的預(yù)處理命令與特性函數(shù)原型允許在函數(shù)申明中指定參數(shù)類型一些新的關(guān)鍵字,包括 const、volatile 與 signed寬字符、寬字符串與字節(jié)多字符對(duì)約定規(guī)則、聲明和類型檢查的許多小改動(dòng)與澄清
WG14工作小組之后又于
1995年
,對(duì)1985年頒布的標(biāo)準(zhǔn)做了兩處技術(shù)修訂(缺陷修復(fù))和一個(gè)補(bǔ)充(擴(kuò)展)。下面是 1995 年做出的所有修改:
3 個(gè)新的標(biāo)準(zhǔn)庫(kù)頭文件 iso646.h、wctype.h 和 wchar.h幾個(gè)新的記號(hào)與預(yù)定義宏,用于對(duì)國(guó)際化提供更好的支持printf/sprintf 函數(shù)一系列新的格式代碼大量的
函數(shù)
和一些
類型
與
常量
,用于
多字節(jié)字符
和
寬字節(jié)字符
C99
在ANSI的標(biāo)準(zhǔn)確立后,C語(yǔ)言的規(guī)范在一段時(shí)間內(nèi)沒有大的變動(dòng),然而C++在自己的標(biāo)準(zhǔn)化建立過(guò)程中繼續(xù)發(fā)展壯大。《標(biāo)準(zhǔn)修正案一》在1995年
為C語(yǔ)言建立了一個(gè)新標(biāo)準(zhǔn),但是只修正了一些C89標(biāo)準(zhǔn)中的細(xì)節(jié)和增加更多更廣得國(guó)際字符集支持。不過(guò),這個(gè)標(biāo)準(zhǔn)引出了1999年ISO
9899:1999的發(fā)表。它通常被成為C99。C99被ANSI于
2000年
3月采用。
在C99中包括的特性有:
對(duì)編譯器限制增加了,比如源程序每行要求至少支持到 4095 字節(jié),變量名函數(shù)名的要求支持到 63 字節(jié)(extern 要求支持到 31)預(yù)處理增強(qiáng)了。例如:
宏
支持取可變參數(shù) #define Macro(...) __VA_ARGS__- 使用
宏
的時(shí)候,參數(shù)如果不寫,
宏
里用 #,## 這樣的東西會(huì)擴(kuò)展成空串。(以前會(huì)出錯(cuò)的) - 支持 // 行注釋(這個(gè)特性實(shí)際上在C89的很多編譯器上已經(jīng)被支持了)
增加了新關(guān)鍵字 restrict, inline, _Complex, _Imaginary, _Bool
- 支持 long long, long double _Complex, float _Complex 這樣的類型
支持 %: %:%: ,等等奇怪的符號(hào)替代,D&E 里提過(guò)這個(gè)支持了不定長(zhǎng)的數(shù)組。數(shù)組的長(zhǎng)度就可以用變量了。聲明類型的時(shí)候呢,就用 int a 這樣的寫法。不過(guò)考慮到效率和實(shí)現(xiàn),這玩意并不是一個(gè)新類型。所以就不能用在全局里,或者 struct union 里面,如果你用了這樣的東西,goto 語(yǔ)句就受限制了。變量聲明不必放在語(yǔ)句塊的開頭,for 語(yǔ)句提倡這么寫 for(int i=0;i當(dāng)一個(gè)類似結(jié)構(gòu)的東西需要臨時(shí)構(gòu)造的時(shí)候,可以用(type_name){xx,xx,xx} 這有點(diǎn)像 C++ 的構(gòu)造函數(shù)初始化結(jié)構(gòu)的時(shí)候現(xiàn)在可以這樣寫:
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 是對(duì) .c,.d 賦值的
字符串里面,\u 支持 unicode 的字符支持 16 進(jìn)制的浮點(diǎn)數(shù)的描述所以 printf scanf 的格式化串多支持了 ll / LL(VC6 里用的 I64)對(duì)應(yīng)新的 long long 類型。浮點(diǎn)數(shù)的內(nèi)部數(shù)據(jù)描述支持了新標(biāo)準(zhǔn),這個(gè)可以用 #pragma 編譯器指定除了已經(jīng)有的 __line__ __file__ 以外,又支持了一個(gè) __func__ 可以得到當(dāng)前的函數(shù)名對(duì)于非常數(shù)的表達(dá)式,也允許編譯器做化簡(jiǎn)修改了對(duì)于/% 處理負(fù)數(shù)上的定義,比如老的標(biāo)準(zhǔn)里 -22 / 7 = -3, -22 % 7 = -1 而現(xiàn)在 -22 / 7 = -4, -22 % 7 = 6取消了不寫函數(shù)返回類型默認(rèn)就是 int 的規(guī)定允許 struct 定義的最后一個(gè)數(shù)組寫做 [] 不指定其長(zhǎng)度描述const const int i;將被當(dāng)作 const int i;處理增加和修改了一些標(biāo)準(zhǔn)頭文件,比如定義 bool 的 定義一些標(biāo)準(zhǔn)長(zhǎng)度的 int 的
定義復(fù)數(shù)的 定義寬字符的
有點(diǎn)泛型味道的數(shù)學(xué)函數(shù) 跟浮點(diǎn)數(shù)有關(guān)的 。
里多了一個(gè) va_copy 可以復(fù)制 ... 的參數(shù)。 里多了個(gè) struct tmx 對(duì) struct tm
做了擴(kuò)展輸入輸出對(duì)寬字符還有長(zhǎng)整數(shù)等做了相應(yīng)的支持
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/9861/showart_2124132.html |
|