程式語言
Python、C、C++、Java、JavaScript、TypeScript、Go、R 與 Haskell 教學,從入門語法到進階技巧。
練習題與詳解 — 10 前置處理器(The Preprocessor)
本檔收錄本單元的練習題、完整解題思路與參考解答。 強烈建議先自己動手做:看完題目就闔上這份檔案,寫出你的版本、編譯、執行、卡住了再回來看「解題思路」; 真的做完了,再對照「參考解答」與「程式碼講解」。每題的完整程式碼也放在 exercises/ 資料夾,可直接編譯:
閱讀文章 →10 前置處理器(The Preprocessor)
前置處理器在編譯之前對原始碼做純文字處理:引入檔案(#include)、 巨集替換(#define)、條件編譯(#if 家族)。 它功能強大但只是「文字取代」——不懂型別、不懂語法,因此陷阱特別多。 本單元教你安全地駕馭它。
閱讀文章 →練習題與詳解 — 11 檔案輸入輸出(File I/O)
本檔收錄本單元的練習題、完整解題思路與參考解答。 強烈建議先自己動手做:看完題目就闔上這份檔案,寫出你的版本、編譯、執行、卡住了再回來看「解題思路」; 真的做完了,再對照「參考解答」與「程式碼講解」。每題的完整程式碼也放在 exercises/ 資料夾,可直接編譯:
閱讀文章 →11 檔案輸入輸出(File I/O)
程式的資料若只存在記憶體,程式一結束就煙消雲散。 本單元學習 C 標準庫的檔案 I/O:開檔、讀寫(字元/行/格式化/二進位)、 定位、錯誤處理。所有範例都自己先建立測試檔(寫到 /tmp/)再讀取, 不依賴任何外部檔案,直接編譯執行即可看到完整結果。
閱讀文章 →練習題與詳解 — 函式指標
本檔收錄 6 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住超過 30 分鐘再看「解題思路」,寫完再對照「參考解答」與「程式碼講解」。 每題的完整程式碼也放在 exercises/ 資料夾,可直接編譯執行:
閱讀文章 →函式指標(Function Pointers)
函式指標是 C 語言最強大也最容易令初學者卻步的特性之一。它讓「行為」本身變成可以傳遞、儲存、替換的資料, 是實作回呼(callback)、命令分派(dispatch table)、外掛架構(plugin)與泛型演算法(如 qsort)的基礎。 本單元以 K&R §5.11 的通用排序程式為主軸,完整介紹函式指標的語法與實務應用。
閱讀文章 →練習題與詳解 — 複雜宣告
本檔收錄 5 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題的完整程式碼放在 exercises/:
閱讀文章 →複雜宣告(Complicated Declarations)
C 的宣告語法遵循「宣告模仿使用」(declaration mirrors use)的哲學,優雅但也造就了 char (*(*x[3])())[5] 這種令人望之生畏的天書。本單元教你系統化的解讀方法——右左法則 (也稱 spiral rule 的嚴謹版),並徹底釐清 const 與指標、陣列指標與指標陣列、 函式指標的各種組合。對應 K&R §5.12,該節的 dcl 程式正是為了把宣告翻譯成英文而寫的。
閱讀文章 →練習題與詳解 — 命令列引數
本檔收錄 5 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →命令列引數(Command-Line Arguments)
程式與外界溝通最古老、最普遍的介面就是命令列引數。Unix 哲學中「小工具 + 管線」的組合能力, 正建立在每個程式都能透過 argc/argv 接收參數之上。本單元對應 K&R §5.10, 從 echo 範例出發,實作簡易版 grep,並補充現代選項解析(getopt)與環境變數(getenv)。
閱讀文章 →練習題與詳解 — 位元運算技巧
本檔收錄 5 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →位元運算技巧(Bitwise Techniques)
位元運算是 C 貼近硬體的招牌能力:驅動程式的暫存器操作、網路協定的欄位打包、 權限旗標、雜湊函式、壓縮與加密,處處都是位元運算。本單元對應 K&R §2.9, 從六個運算子出發,系統整理遮罩、位移、欄位擷取,以及一批面試與實務都常見的位元技巧。
閱讀文章 →練習題與詳解 — 可變引數函式
本檔收錄 5 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →可變參數函式(Variadic Functions)
printf 為什麼可以接受任意個數、任意型別的引數?答案是 C 的可變參數機制: <stdarg.h> 提供的 va_list 家族。本單元對應 K&R §7.3 的 minprintf 範例, 帶你親手實作一個迷你 printf,並徹底理解「預設引數提升」這個可變參數最重要的規則。
閱讀文章 →練習題與詳解 — 鏈結串列
本檔收錄 6 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →鏈結串列(Linked Lists)
陣列的大小固定、中間插入要整批搬移;鏈結串列用「節點 + 指標」換來動態成長與 O(1) 插入。 它是第一個要你同時駕馭 struct、malloc/free 與指標的指標的資料結構, 也是作業系統核心(行程佇列、檔案系統快取)與各種函式庫的基本零件。 本單元對應 K&R §6.5 的自我參考結構概念,完整實作單向與雙向鏈結串列。
閱讀文章 →練習題與詳解 — 堆疊與佇列
本檔收錄 5 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →堆疊與佇列(Stacks & Queues)
堆疊(LIFO:後進先出)與佇列(FIFO:先進先出)是最基本的兩種「受限存取」容器: 限制越多、實作越簡單、行為越好推理。函式呼叫、運算式求值、undo 機制靠堆疊; 排程、緩衝、訊息傳遞靠佇列。本單元同時給出「陣列版」與「鏈結版」實作, 並以 K&R §4.3 逆波蘭計算機的概念實作 RPN 求值器。
閱讀文章 →練習題與詳解 — 樹
本檔收錄 5 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →樹(Trees)
樹是第一個「遞迴天生合理」的資料結構:每個子樹本身就是一棵樹, 於是插入、搜尋、走訪的程式碼幾乎就是定義本身。二元搜尋樹(BST)把「排序」 內建到結構裡,讓搜尋從 O(n) 降到 O(log n)。本單元對應 K&R §6.5 的單字計數樹 ——K&R 全書最精彩的完整範例之一,並補充四種走訪、樹的釋放與平衡概念。
閱讀文章 →練習題與詳解 — 雜湊表
本檔收錄 5 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →雜湊表(Hash Tables)
「給我一個字串,我立刻告訴你對應的值」——平均 O(1) 的查找就是雜湊表的魔法。 編譯器的符號表、shell 的環境變數、Python 的 dict、資料庫的索引快取, 底層都是它。本單元對應 K&R §6.6 的表格查詢(table lookup)範例, 實作 hash/lookup/install/undef 全套,並補充 djb2 雜湊、負載因子與 rehash。
閱讀文章 →練習題與詳解 — UNIX 系統介面
本檔收錄 6 題由易到難的練習。建議流程:先蓋住解答自己寫,卡住再看 「解題思路」,寫完對照「參考解答」。每題完整程式碼在 exercises/:
閱讀文章 →UNIX 系統介面(The UNIX System Interface)
printf、fopen 這些標準函式庫的底下是什麼?答案是作業系統的系統呼叫(system call)。 K&R 第 8 章揭開這層面紗:檔案描述子、open/read/write/close、目錄與 inode。 理解這一層,你才真正知道 I/O 的成本從哪來、緩衝為什麼存在、 以及 ls、cat 這些工具是怎麼寫出來的。本單元所有範例皆用 POSIX API, 在 macOS(與 Linux)可直接編譯執行,並且只操作 /tmp
閱讀文章 →