C語言中32個關(guān)鍵字詳解
由 ANSI 標(biāo)準(zhǔn)定義的 C 語言關(guān)鍵字共32個蔚晨,根據(jù)關(guān)鍵字的作用,可以將關(guān)鍵字分為數(shù)據(jù)類型關(guān)鍵字和流程控制關(guān)鍵字兩大類肛循。
一铭腕、數(shù)據(jù)類型關(guān)鍵字
A 基本數(shù)據(jù)類型(5個)
void:聲明函數(shù)無返回值或無參數(shù),聲明無類型指針多糠,顯示丟棄去處結(jié)果
char:字符型類型數(shù)據(jù)累舷,屬于整型數(shù)據(jù)的一種
int:整型數(shù)據(jù),通常為編譯器指定的機(jī)器字長
float:單精度浮點(diǎn)數(shù)據(jù)夹孔,屬于浮點(diǎn)數(shù)據(jù)的一種
double:雙精度浮點(diǎn)數(shù)據(jù)被盈,屬于浮點(diǎn)數(shù)據(jù)的一種
B 類型修飾關(guān)鍵字(4個)
short:修飾 int,短整型數(shù)據(jù)析蝴,可省略被修飾的 int
long:修飾 int害捕,長整形數(shù)據(jù),可省略被修飾的 int
signed:修飾整型數(shù)據(jù)闷畸,有符號數(shù)據(jù)類型
unsigned:修飾整型數(shù)據(jù)尝盼,無符號數(shù)據(jù)類型
C 復(fù)雜類型關(guān)鍵字(5個)
struct:結(jié)構(gòu)體聲明
union:共用體聲明
enum:枚舉聲明
typedef:聲明類型別名
sizeof:得到特定類型或特定類型、變量的大小
D 存儲級別關(guān)鍵字(6個)
auto:指定為自動亦是佑菩,由編譯器自動分配及釋放盾沫。通常在棧上分配
static:指定為靜態(tài)變量,分配在靜態(tài)變量區(qū)殿漠,修飾函數(shù)時赴精,指定函數(shù)指針作用域?yàn)槲募?nèi)部
register:指定為寄存器變量,建議編譯器將變量存儲到寄存器中使用绞幌,也可以修飾函數(shù)形參蕾哟,建議編譯器通過寄存器而不是堆棧傳遞參數(shù)
extern:指定對應(yīng)變量為外部變量,即在另外的目標(biāo)文件中定義,可以認(rèn)為是約定由另外文件聲明的變量
const:與 volatile 合稱“CV特性”谭确,指定變量不可被當(dāng)前線程/進(jìn)程改變(但有可能被系統(tǒng)或其它線程/進(jìn)程改變)
volatile:與 const 合稱“CV特性”帘营,指定變量的值有可被系統(tǒng)或其它線程/進(jìn)程改變,強(qiáng)制編譯器每次從內(nèi)存中取得該變量的值
二逐哈、流程控制關(guān)鍵字
A 跳轉(zhuǎn)結(jié)構(gòu)(4個)
return:用在函數(shù)體中芬迄,返回特定的值(或者是 void 值,即不返回值)
continue:結(jié)束當(dāng)前循環(huán)昂秃,開始下一輪循環(huán)
break:跳出當(dāng)前循環(huán)或 switch 結(jié)構(gòu)
goto:無條件跳轉(zhuǎn)語句
B 分支結(jié)構(gòu)(5個)
if:條件語句
else:條件語句否定分支(與 if ?連用)
switch:開關(guān)語句(多重分支語句)
case:開關(guān)語句中的分支標(biāo)記
default:開關(guān)語句中的“其它”分治禀梳,可選
C 循環(huán)結(jié)構(gòu)(3個)
for:for 循環(huán)結(jié)構(gòu),for(1;2;3)4;的執(zhí)行順序?yàn)?->2->4->3->2...循環(huán)肠骆,其中2為循環(huán)條件
do:do循環(huán)結(jié)構(gòu)算途,do 1 while(2);的執(zhí)行順序是1->2->1...循環(huán),2為循環(huán)條件
while:while循環(huán)結(jié)構(gòu)蚀腿,while(1)2;的執(zhí)行順序1->2->1...郊艘,1為循環(huán)條件以上循環(huán)語句,當(dāng)循環(huán)條件表達(dá)式為真則繼續(xù)唯咬,是假則跳出循環(huán)。
三畏浆、C99 和 C89 標(biāo)準(zhǔn)對比多了些什么
1胆胰、restrict:指針類型修飾符
C99 中增加了適用于指針的 restrict 類型修飾符,它是?初始訪問指針?biāo)杆笇ο蟮奈ㄒ煌緩娇袒瘢虼酥挥薪柚?restrict 指針表達(dá)式才能訪問對象蜀涨。restrict 指針主要用做函數(shù)變元,或者指向由 malloc() 函數(shù)所分配的內(nèi)存變量蝎毡。restrict 數(shù)據(jù)類型不改變程序的語義厚柳。
如果某個函數(shù)定義了兩個 restrict 指針變元,編譯器就假定它們指向兩個不同的對象沐兵,memcpy()函數(shù)就是 restrict 指針的一個典型應(yīng)用示例别垮。C89 中的 memcpy()函數(shù)原型如下:
代碼:
void *memcpy(void *s1, const void *s2, size_t size);
如果 s1 和 s2 所指向的對象重疊,其操作就是未定義的扎谎。memcpy()函數(shù)中只能用于不重疊的對象碳想。C99 中的 memcpy()函數(shù)原型如下:
代碼:
void *memcpy(void * restrict s1, const void * restrict s2, size_t size);
通過使用 restrict 修飾 s1 和 s2 變元,可確保它們在該原型中指定不同的對象。
2、inline(內(nèi)聯(lián))關(guān)鍵字
內(nèi)聯(lián)函數(shù)除了保持結(jié)構(gòu)化和函數(shù)式的?定義方式外咐鹤,還能使程序員寫出高效率的代碼誊涯。函數(shù)的每次調(diào)用與返回都會消耗相當(dāng)大的系統(tǒng)資源,尤其是當(dāng)函數(shù)調(diào)用發(fā)生在重復(fù)次數(shù)很多的循環(huán)語句中時浊吏。一般情況下颗胡,當(dāng)發(fā)生一次函數(shù)調(diào)用時们何,變元需要進(jìn)棧岩遗,各種?寄存器內(nèi)存需要保存扇商。當(dāng)函數(shù)返回時,寄存器的內(nèi)存需要恢復(fù)喘先。如果該函數(shù)在代碼內(nèi)進(jìn)行聯(lián)機(jī)擴(kuò)展钳吟,當(dāng)代碼執(zhí)行時,這??些保存和恢復(fù)操作旅游活動會再發(fā)生窘拯,而且函數(shù)調(diào)用的執(zhí)行速度也會大大加快红且。函數(shù)的聯(lián)機(jī)擴(kuò)展會產(chǎn)生較長的代碼,所以只應(yīng)該內(nèi)聯(lián)對應(yīng)程序性能有顯著影響的函數(shù)以及長度較短的函數(shù)涤姊。
3暇番、新增數(shù)據(jù)類型
_Bool
值是0或1。C99 中增加了用來定義 bool思喊、true 以及 false 宏的頭文件夾<stdbool.h>壁酬,以便程序員能夠編寫同時兼容于 C 與 C++ 的應(yīng)用程序。在?編寫新的應(yīng)用程序時恨课,應(yīng)該使用 <stdbool.h> 頭文件中的 bool 宏舆乔。