前言
C 標準定義 32 個關鍵字(C99 增加 5 個,C11 再增 7 個)。本文按功能分類,逐一解析含義、典型用法及易錯點,作為開發時的快速參考。
1. 數據類型關鍵字 (12)
| 關鍵字 | 說明 | 典型大小/範圍 |
| int | 基本整型 | 至少 16 位,通常 32 位 |
| short | 短整型 | 至少 16 位 |
| long | 長整型 | 至少 32 位 |
| long long | 長長整型 (C99) | 至少 64 位 |
| signed | 有符號修飾 | 默認 |
| unsigned | 無符號修飾 | 擴大正數範圍 |
| char | 字符型/字節 | 8 位(實現定義符號性) |
| float | 單精度浮點 | IEEE 754 binary32 |
| double | 雙精度浮點 | IEEE 754 binary64 |
| long double | 擴展精度浮點 | ≥ double |
| void | 空類型 | 無值、泛型指針 |
| _Bool / bool | 布爾類型 (C99, 需 <stdbool.h>) | 0/1 |
提示:使用 stdint.h 定義的精確寬度類型(int32_t, uint64_t 等)提高可移植性。
2. 類型修飾與聲明 (6)
| 關鍵字 | 作用 | 關鍵點 |
| const | 只讀限定 | 修飾指針時區分 const int* vs int* const;函數參數傳指針常用 |
| volatile | 易變限定 | 防止編譯器優化掉對內存/寄存器的訪問;用於硬件寄存器、信號處理、多線程標志 |
| restrict | 無別名提示 (C99) | 告訴編譯器該指針是訪問對象的唯一路徑,允許積極優化 |
| static | 靜態存儲/內部鏈接 | 局部變量保持值;全局/函數限制本文件可見 |
| extern | 外部聲明 | 聲明而非定義;跨文件共享變量/函數 |
| register | 寄存器建議 | 現代編譯器自動優化,基本忽略;不可取地址 |
3. 控制流關鍵字 (12)
| 關鍵字 | 用法示例 | 注意事項 |
| if / else | if (cond) stmt; else stmt; | 懸掛 else 原則:與最近的 if 配對 |
| switch / case / default | switch (expr) { case const: ... default: ... } | case 標簽為常量表達式;無 break 會貫穿 |
| for | for (init; cond; inc) stmt; | 三部分均可為空;C99 允許聲明變量 |
| while | while (cond) stmt; | 先判斷後執行 |
| do / while | do stmt; while (cond); | 至少執行一次 |
| break | 跳出最近循環或 switch | 不影響 if/else |
| continue | 跳過本輪循環餘下部分 | 僅用於循環 |
| goto | goto label; ... label: stmt; | 慎用;可用於多層循環跳出、錯誤處理統一出口 |
| return | return [expr]; | 非 void 函數所有路徑必須返回值 |
4. 複合類型與對齊 (4)
| 關鍵字 | 說明 |
| struct | 結構體,成員順序佈局,大小受對齊影響 |
| union | 共用體,成員共享內存,大小等於最大成員 |
| enum | 枚舉類型,命名整型常量集合,兼容 int |
| typedef | 類型別名,不創建新類型,增強可讀性與可移植性 |
5. 內存與對齊 (3)
| 關鍵字 | 說明 |
| sizeof | 編譯時運算符,返回類型/表達式大小(字節),括號可省略當操作數為變量 |
| _Alignas / alignas | 對齊規定 (C11),指定變量/類型對齊要求 |
| _Alignof / alignof | 對齊查詢 (C11),返回類型/表達式對齊要求 |
6. C11 新增關鍵字 (7)
_Generic:泛型選擇,編譯時根據類型選擇表達式,實現類似重載。
_Static_assert / static_assert:編譯期斷言。
_Thread_local / thread_local:線程局部存儲。
_Noreturn / noreturn:標記函數不返回(如 exit、abort)。
_Atomic / atomic:原子類型(需 <stdatomic.h>)。
7. 保留關鍵字 (不可作標識符)
以雙下劃線開頭或下劃線+大寫字母開頭的標識符保留給實現使用(如 __func__, _Alignas)。
速查建議
- 優先使用
const、static 限制可見範圍與可修改性。
- 避免
goto、register,現代編譯器更優秀。
- 跨文件共享變量:.c 定義,.h 用
extern 聲明。
- 硬件/並發相關變量必加
volatile(配合原子操作/鎖)。
- 使用
stdint.h 精確類型,stdbool.h 布爾類型。