c語言由dennis m. ritchie在2023年設計和實現。從那以後使用者逐漸增加。到2023年ritchie和bell實驗室的另一位程式專家kernighan合寫了著名的《thec programming language》,將c語言推向全世界,許多國家都出了譯本,國內有一些c語言書就是這本書的翻譯或者編譯。由這本書定義的c語言後來被人們稱作k&r c。
隨著c語言使用得越來越廣泛,出現了許多新問題,人們日益強烈地要求對c語言進行標準化。這個標準化的工作在美國國家標準局(ansi)的框架中進行(1983-1988),最終結果是2023年10月頒布的ansi標準x3.159-1989,也就是後來人們所說的ansic標準。由這個標準定義的c語言被稱作ansi c。
ansi c標準很快被採納為國際標準和各國的標準。國際標準為iso/iec 9899-1990,中國國家標準gb/t15272-94是國際iso標準的中文翻譯。
ansi c標準化工作的乙個主要目標是清除原來c語言中的不安全、不合理、不精確、不完善的東西。由此也產生了ansic與k&r c之間的差異。從總體上看,這些差異反應的是c語言走向完善、走向成熟。
ansi c 對 k&r c 的修訂
(本段根據《c programming language》和c語言標準整理。不求完整,希望列出最常見的差異)
對於原始檔內部的識別符號,有效的最小長度擴充到31個字元。檔案間連線時,識別符號的最小有效長度仍然為6個字元。(許多實現都支援更大的長度)
增加了幾個新關鍵字:void,const,volatile,signed,enum。拋棄了老關鍵字entry。
在換意字元 \ 之後寫非規定的序列,其作用確定為無定義。
規定8和9都不是八進位制數的合法字元。
引進了數的字尾字元:整數的u和l,浮點數的f和l。
規定連續出現的字串常量將被拼接在一起。
引進了「寬字元」的概念。
將字元也確定為帶符號(signed)和不帶符號(unsigned)的。
丟棄了long float(原來作為double的同義詞)。
引入了void型別,用 (void*) 表示通用指標的型別(過去人們通常用 (char*))。
對算術型別規定了最小表示範圍。要求每個c語言系統用標頭檔案(和)說明實現中的具體規定。
引進了列舉定義enum。
採用了來自c++的型別修飾符,如const。
規定字串常量是不可修改的。
改變了算術型別的隱含轉換規則。
刪去了一些過時賦值運算子,如 =+。規定賦值運算子都是基本單詞,如 += 之間不能有空格分隔。
引進了與一元 - 運算子對應的一元 + 運算子。
指向函式的指標可以直接放在函式呼叫的位置,不必顯式地寫間接操作。
允許結構地整體賦值,作為函式引數和返回值傳遞。
允許將取位址運算子作用於陣列,得到的是指向有關陣列的指標。
標準規定 sizeof 運算子的返回值為 size_t 型別(某個無符號整型),這一型別在標準標頭檔案裡定義。同時在那裡定義的還有 ptrdiff_t 型別,它是指標減運算的結果型別。
規定取位址運算子不能作用於 register 變數。
規定移位表示式的型別為其左運算物件的型別。
允許建立指向過陣列末元素乙個位置的指標,以及對它的算術運算和關係運算。
(從c++)引進了包含引數型別的函式原型概念,引進了變長參數列函式的概念。仍允許老的形式,但僅僅是作為過時形式保留。
標準規定任何區域性宣告的作用域僅僅是當前的塊(復合語句)。
規定函式引數作為加入函式體(復合語句)的宣告,因此不能用變數宣告去覆蓋。
有關名字空間的規定:所有結構、聯合和列舉標記在乙個名字空間裡,標號是另乙個名字空間。
聯合變數在定義時也可以初始化,規定初始化其第乙個成分。
自動結構、聯合和陣列也可以初始化,但限制其初始化方式(其中只能包含常量表示式)。
帶大小描述的字元陣列也可以用大小與之相同的字串常量初始化(結束的 \0 被刪除)。
開關語句的控制表示式和case標號可以是任何整型的(包括字元型別)。
K R C與ANSI C函式宣告的區別
k r c的函式宣告 function 這種方式宣告的函式,在向其傳遞引數時,較小型別的引數會被進行隱式型別轉換,如char short被轉換為int,float被轉換為double。即堆疊中所儲存的引數其所佔位元組數大於實際應該占用的位元組 ansi c的函式宣告 int function cha...
C和指標 K R C 與 ANSI C的區別
c語言由dennis m.ritchie在1973年設計和實現。從那以後使用者逐漸增加。到1978年ritchie和bell實驗室的另一位程式專家kernighan合寫了著名的 the c programming language 將c語言推向全世界,許多國家都出了譯本,國內有一些c語言書就是這本書...
GNU C 與 ANSI C的區別
1.零長度陣列 gnu c允許使用零長度陣列,定義變長度物件時比較方便 struct var data var data的大小僅為乙個int型,data是常量位址,data index 是訪問其後的記憶體空間。struct var data s malloc sizeof var data len ...