C語言的關鍵字共有32個。
一、資料類型關鍵字(12個):
關鍵字 | 作用 |
char | 聲明字元型變量或函數 |
double | 聲明雙精度變量或函數 |
float | 聲明浮點型變量或函數 |
int | 聲明整型變量或函數 |
short | 聲明短整型變量或函數 |
long | 聲明長整型變量或函數 |
signed | 聲明有符号類型變量或函數 |
unsigned | 聲明無符号類型變量或函數 |
void | 聲明函數無傳回值或無參數,聲明無類型指針(基本上就這三個作用) |
enum | 聲明枚舉類型 |
struct | 聲明結構體變量或函數 |
union | 聲明聯合資料類型 |
二、控制語句關鍵字(12個):
分類 | 關鍵字 | 作用 |
循環語句 | for | 一種循環語句(可意會不可言傳) |
do | 循環語句的循環體 | |
while | 循環語句的循環條件 | |
break | 跳出目前循環 | |
continue | 結束目前循環,開始下一輪循環 | |
條件語句 | if | 條件語句 |
else | 條件語句否定分支(與 if 連用) | |
goto | 無條件跳轉語句 | |
開關語句 | switch | 用于開關語句 |
case | 開關語句分支 | |
default | 開關語句中的“其他”分支 | |
return | 子程式傳回語句(可以帶參數,也看不帶參數) |
三、存儲類型關鍵字(4個)
關鍵字 | 作用 |
auto | 聲明自動變量一般不使用 |
extern | 聲明變量是在其他檔案中聲明(也可以看做是引用變量) |
register | 聲明寄存器變量 |
static | 聲明靜态變量 |
四、其他關鍵字(4個)
關鍵字 | 作用 | |
const | 聲明隻讀變量 | 常量修飾符,類型限定詞 |
sizeof | 計算資料類型長度 | |
typedef | 用以給資料類型取别名(當然還有其他作用) | 存儲類關鍵詞 |
volatile | 說明變量在程式執行中可被隐含地改變 | 類型修飾符(type specifier),指令關鍵字。 |
Volatile:應該解釋為“直接存取原始記憶體位址”比較合适。作用是作為指令關鍵字,確定本條指令不會因編譯器的優化而省略,且要求每次直接讀值。精确地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用儲存在寄存器裡的備份。
使用地方:
1、中斷服務程式修改的供其他程式檢測的變量需要加volatile
2、多任務環境下各任務間共享的标志應該加volatile
3、存儲器映射的硬體寄存器通常要加volatile,因為每次對它的讀寫都可能有不同意義
Const:
要求它所修飾的對象為常量,不可被改變,不可被指派,不可作為左值
1、 可以定義const常量,具有不可變性。
2、 便于進行類型檢查,使編譯器對處理内容有更多了解,消除了一些隐患
使用地方:
1、 在函數聲明時修飾參數
memmove(void *dst, const void *src, size_t len);
Static:
1、 static修飾一個函數,則這個函數隻能在本文本中調用,不能被其他檔案調用。
2、 static修飾局部變量,則這個局部變量存放在全局資料區的靜态變量區,初始化時自動初始化為0。初始化操作隻執行一次;這個局部變量的生命周期延長,直到程式運作結束以後才釋放。
3、 static修飾全局變量,則這個全局變量隻能在本檔案中通路,不能在其他檔案中通路。即便是extern外部聲明也不可以。
Typedef:
1、 typedef沒有建立任何新類型,它隻是為某個已存在的類型增加一個友善使用的标簽。
2、 與#define不同,typedef建立的符号名隻受限于類型,不能用于值
3、 typedef由編譯器解釋,不是預處理器
4、 定義函數指針
typedef 傳回類型(*新類型)(參數表)
typedef char (*PTRFUN)(int);
typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,并定義這
種類型為指向某種函數的指針,這種函數以一個int為參數并傳回char類型。
typedef VOID (*oal_callback_t)(VOID); //定義一類函數指針, 該類指針指向的函數入參和傳回值都為空
inline 内聯函數
在C語言中,如果一些函數被頻繁調用,不斷有函數入棧,即函數棧,會造成棧空間的大量消耗。
1、 關鍵字inline必須與函數定義體放在一起才能使函數成為内聯,僅将inline放在函數聲明前面不起任何作用。
2、 inline隻适合函數體内代碼簡單的函數使用,不能包含複雜的結構控制語句例如while、switch,并且内聯函數本身不能是直接遞歸函數(自己内部還調用自己的函數)。
3、 内聯是以代碼膨脹(複制)為代價。僅僅省去了函數調用的開銷,進而提高函數的執行效率。
4、 每一次内聯函數的調用都要指派代碼,将使程式的總代碼量增大,消耗更多的記憶體空間。