標准C與經典C的比較
本附錄列出了標准C與經典C之間 (即Kernighan和Ritchie合著的The C Programming Language一書第
1版所描述的語言)的大多數顯著差異。標題指明了本書的哪章在討論每個標准C的特性。本附錄沒有介
紹C庫,因為它已經變化很多年了。
如果用戶的編譯器沒有聲明是“標准的”,那麼最好的辦法是查看編譯器手冊來了解此編譯器可以提
供的標准C的特性數量。事實上,所有C語言編譯器至少都可以處理一些較新的特性。
對於標准C和經典C之間的其他(不十分重要的)差異,請參考The C Programming Language一書第2
版的附錄A和附錄C。
第2章 C語言基本概念
標識符 在經典C中,只有標識符的前8個字符是有意義的。
關鍵字 經典C缺少關鍵字const、enum、signed、void和volatile。在經典C中,單詞
entry是關鍵字。
第4章 表達式
一元+ 經典C不提供一元+運算符。
第5章 選擇語句
switch 在經典C中,switch語句中的控制表達式(和情況標號)在提升後必須具有int類
型。而在標准C中,表達式和標號可以是任何一種整數類型,包括unsigned int
類型和long int類型。
第7章 基本類型
無符號類型 經典C只提供一種無符號類型(unsigned int)。
singed 經典C不支持signed類型說明符。
數的後綴 說明整型常量是無符號的情況時,經典C不提供U(或u)後綴,而且說明浮點常量作
為float型而不是double型存儲時,經典C也不提供F(或f)後綴。在經典C中,L
(或l)後綴不能用於浮點常量。
long float 經典C把long float用作是double的同義詞,而這種用法在標准C中是不合法的。
long double 經典C不提供long double類型。
轉義序列 在經典C中不存在轉義序列\a、\v和\?。而且經典C不提供十六進制的轉義序列。
size_t 在經典C中,sizeof運算符返回int類型值。而在標准C中,它則返回size_t類型
值。
通用的算術轉換 經典C要求把float型運算數轉換成double型的,而且,經典C說明較短的無符號整數與
較長的有符號整數結合始終會產生無符號的結果。
第9章 函數
函數定義 在標准C的函數定義中,參數列表中含有參數的類型:
附錄 C
597416 附錄 C 標准 C 與經典 C 的比較
double square(double x)
{
return x * x;
}
經典C則要求在單獨列表中說明參數的類型:
double square(x)
double x
{
return x * x;
}
函數聲明 標准C的函數聲明 (原型) 指明了函數參數的類型 (如果需要, 也可以有參數的名字) :
double square(double x);
double square(double); /* alternate form */
int rand(void); /* no parameters */
經典C的函數聲明忽略了關於形式參數的全部信息:
double square();
int rand();
函數調用 當使用經典C的定義或聲明時,編譯器不檢查帶參數的被調用函數是否有正確的參數
數量和類型。此外,實參也不會自動轉換成相應形式參數的類型。相反,執行整數
的提升,並把float型參數轉換成為double型。
void 經典C不支持void類型。
第12章 指針和數組
指針減法 兩個指針相減, 在經典C中產生int型的值, 而在標准C中則產生ptrdiff_t型的值。
第13章 字符串
字符串字面量 在經典C中,鄰近的字符串字面量是無法連接的。而且,經典C不禁止字符串字面量的
修改。
字符串初始化 在經典C中,長度為n的字符數組的初始化式限制在n-1個字符之內(為結尾的空字符
預留空間)。而標准C允許初始化式長度為n。
第14章 預處理器
#elif、#error、
#pragma
經典C不提供#elif、#error和#pragma指令。
#、##、defined 經典C不提供#、##和defined運算符。
第16章 結構、聯合和枚舉
結構和聯合的
成員與標記
在標准C中,每個結構和聯合都有針對成員的自己的名字空間,且結構和聯合的標記
會被保存在單獨的名字空間中。而經典C為成員和標記采用單一的名字空間,所以成
員無法具有相同的名字(某些例外),而且成員和標記無法重疊。
完全結構的操作 經典C不允許對結構進行賦值、參數傳遞或函數返回操作。
枚舉 經典C不支持枚舉。
第17章 指針的高級應用
void * 標准C把void *用作“普通的”指針類型。例如,malloc函數返回void *類型的
值。而經典C則采用char *來達到此目的。
指針混合 經典C允許在賦值和比較中混合不同類型的指針。而在標准C中,可以把void *類型
的指針與其他類型指針混合,但是其他不帶強制類型轉換的混合是不允許的。類似的,
經典C允許在賦值和比較中混合整數和指針,而經典C則要求進行強制類型轉換。
598
599 附錄 C 標准 C 與經典 C 的比較 417
指向函數的指針 如果pf是指向函數的指針, 則標准C允許使用(*pf)(...)或pf (...) 來調用函數,
而經典C只允許使用(*pf)(...) 來調用函數。
第18章 聲明
const和
volatile
經典C不提供const和volatile類型限定符。
數組、結構和聯
合的初始化
經典C不允許自動初始化數組和結構,而且不允許初始化聯合(不管存儲期限)。
第25章 國際化特性
寬字符 經典C不支持寬字符常量和寬字符串字面量。
關鍵字 經典C不支持三字符序列。
第26章 其他庫函數
可變實際參數 經典C不提供可移植的方法來寫帶可變數量實際參數的函數,而且缺少…(省略號)
符號。