C 語言發展脈絡
| 年份 | 里程碑 | 關鍵人物/機構 |
| 1967 | BCPL 語言誕生 | Martin Richards |
| 1970 | B 語言(BCPL 精簡版) | Ken Thompson |
| 1972 | C 語言誕生 | Dennis Ritchie,貝爾實驗室 |
| 1978 | K&R C(《The C Programming Language》出版) | Kernighan & Ritchie |
| 1989 | ANSI C (C89) | ANSI X3.159 |
| 1990 | ISO C90 | ISO/IEC 9899:1990 |
| 1999 | C99 標準 | 內建 bool、複數、VLA、inline |
| 2011 | C11 標準 | 多執行緒、_Atomic、泛型選擇 |
| 2018 | C17/18 修正版 | 無新特性,純修正 |
| 2024 | C23 標準發布 | 屬性語法、constexpr、模組化等 |
核心特性總覽
- 高級+低級混合:結構化控制流 + 位元/位址直接操作
- 模組化:函數為基本單元,支援分離編譯
- 豐富運算子:34 種運算子,含位運算、三元、逗號運算子
- 指標威力:直接記憶體存取、動態配置、函數指標、多維陣列模擬
- 可移植性:86% 編譯器代碼共用,跨平台首選
- 效能:僅比組語慢 10~20%,嵌入式/系統/高效能首選
基礎語法速查
資料類型
基本:char, short, int, long, long long
浮點:float, double, long double
擴展:_Bool, _Complex, _Imaginary (C99+)
衍生:陣列、指標、結構體、聯合體、枚舉、void
關鍵字(C11 共 44 個)
auto break case char const continue default do double else enum
extern float for goto if inline int long register restrict return
short signed sizeof static struct switch typedef union unsigned
void volatile while _Alignas _Alignof _Atomic _Bool _Complex
_Generic _Imaginary _Noreturn _Static_assert _Thread_local
控制結構
| 類別 | 關鍵字 | 特性 |
| 選擇 | if, else, switch, case, default | switch 僅支援整型常數標籤 |
| 迴圈 | for, while, do-while | for 最靈活,三表達式皆可省略 |
| 跳轉 | break, continue, goto, return | goto 僅限函數內,慎用 |
運算子優先序(高→低)
() [] -> . 後綴
++ -- + - ! ~ * & sizeof (type) 前綴/單目
* / % 算術
+ - 算術
<< >> 位移
< <= > >= 關係
== != 相等
& 位元 AND
^ 位元 XOR
| 位元 OR
&& 邏輯 AND
|| 邏輯 OR
?: 條件
= += -= *= /= %= &= ^= |= <<= >>= 賦值
, 逗號
常見陷阱與最佳實踐
| 陷阱 | 後果 | 正確做法 |
void main() | 非標準,跨平台失敗 | int main(void) 或 int main(int argc, char *argv[]) |
| 未初始化變數 | 未定義行為 | 宣告即初始化 int x = 0; |
| 陣列越界 | 緩衝區溢位、安全漏洞 | 使用 sizeof(arr)/sizeof(arr[0])、邊界檢查 |
| 指標釋放後使用 | Use-after-free | free 後指標置 NULL |
| 字串字面值修改 | 段錯誤 | char s[] = "lit"; 而非 char *s = "lit"; |
gets() 使用 | 緩衝區溢位 | 用 fgets() 或 C11 gets_s() |
現代 C 開發工具鏈
- 編譯器:GCC, Clang, MSVC, ICC
- 建構:CMake, Meson, Make
- 靜態分析:Cppcheck, Clang Static Analyzer, Coverity
- 除錯:GDB, LLDB, Valgrind (記憶體檢查)
- 格式化:clang-format
- 測試:Unity, CMocka, GoogleTest (C++ 兼容)
學習路徑建議
- 語法基礎 → 指標/記憶體模型 → 資料結構/演算法實作
- 系統程式:Linux 系統呼叫、執行緒、網路程式
- 嵌入式:裸機/RTOS、暫存器操作、中斷處理
- 編譯器原理:前端/後端、最佳化、連結器
- 開源貢獻:Linux Kernel, Git, SQLite, Redis 等經典 C 專案