C++ 程 式 設 計 工 程 師 手 冊 序 言 這 本 書 是 寫 給 首 次 接 觸 電 腦 程 式 設 計 的 初 學 者, 以 及 有 志 於 把 程 式 設 計 作 為 發 展 未 來 應 用 專 業 技 能 的 一 項 重 要 工 具 的 程 式 人 員 七 年 來, 筆 者 在 大 一 的 計 算 機 概 論 課 程 中 教 授 C/C++ 程 式 設 計 本 書 即 匯 整 歷 年 的 上 課 講 義, 經 過 編 修 和 去 蕪 存 菁 而 成, 內 容 適 合 大 專 院 校 相 關 課 程 作 為 教 科 書 或 參 考 用 書 本 書 分 成 八 個 主 要 子 題, 相 對 於 一 般 程 式 語 言 的 教 科 書, 其 安 排 較 為 精 簡 緊 湊, 因 此 也 適 用 在 C/C++ 程 式 設 計 的 短 期 或 密 集 訓 練 課 程 中 使 用 市 面 上 已 經 有 很 多 C/C++ 程 式 設 計 的 用 書, 不 論 是 中 文 或 英 文 版 本, 其 中 不 乏 入 門 的 或 教 學 導 向 的 或 技 術 實 作 導 向 的 C/C++ 語 言 教 科 書 ( 有 興 趣 的 讀 者 可 參 考 本 書 最 後 的 參 考 書 目 ) 那 麼, 為 什 麼 還 要 寫 這 本 書 呢? 為 什 麼 寫 這 本 書? 寫 這 本 書 的 動 機 有 三 個 第 一 是 針 對 非 資 訊 專 業 的 理 工 背 景 學 生 或 工 程 師, 培 養 其 良 好 的 程 式 設 計 應 用 專 業 能 力 ; 第 二 從 解 決 問 題 的 面 向 而 非 從 語 言 語 法 的 面 向 來 學 習 程 式 設 計 ; 第 三 以 簡 易 實 用 的 而 非 羅 列 式 (exhaust) 主 題 的 方 式 來 介 紹 程 式 設 計 從 工 程 與 科 學 計 算 的 角 度 出 發 對 於 資 訊 專 業 的 人 員 來 說, 程 式 設 計 通 常 與 計 算 機 結 構 演 算 法 資 料 結 構, 或 是 軟 體 工 程 聯 繫 在 一 起, 或 是 作 為 後 者 一 個 重 要 的 基 礎 技 能 另 一 方 面, 對 於 許 許 多 多 非 資 訊 專 業 的 理 工 背 景 學 生 或 工 程 師 而 言, 程 式 設 計 是 一 個 非 常 重 要 的 解 題 工 具, 它 可 以 協 助 工 程 師 計 算 分 析 設 計 模 擬 控 制 測 試 實 驗 各 式 各 樣 的 工 程 和 科 學 問 題 和 系 統 但 與 資 訊 專 業 人 員 不 同, 工 程 師 們 最 關 心 的 問 題 通 常 是 : 怎 樣 把 領 域 知 識 轉 成 計 算 機 解 題 的 形 式?C/C++ 語 言 提 供 了 必 要 的 工 具 和 方 法, 得 以 幫 助 工 程 師 實 現 這 個 目 標 可 惜 的 是, 只 有 少 數 的 C/C++ 程 式 設 計 用 書, 從 這 個 角 度 切 入 來 引 導 初 學 者 進 入 程 式 設 計 的 領 域 譬 如 說, 多 數 的 書 都 會 花 很 大 的 篇 幅 和 實 例 來 解 說 指 標 (pointer) 的 原 理 和 使 用 技 巧, 這 是 一 個 令 很 多 C/C++ 初 學 者 感 到 頭 痛 的 主 題, 也 是 造 成 程 式 除 錯 的 困 難 和 程 式 執 行 時 不 穩 定 狀 況 發 生 的 最 主 要 來 源 之 一, 但 很 少 有 工 程 師 在 學 習 時 候 就 知 道, 在 計 算 的 用 途 上, 我 們 可 以 把 指 標 的 用 途 限
定 在 矩 陣 的 動 態 記 憶 體 配 置, 而 在 其 他 場 合, 盡 量 避 免 使 用 指 標, 而 仍 可 達 到 相 同 的 程 式 效 能 重 要 的 是, 我 們 的 程 式 因 此 可 以 更 方 便 除 錯 程 式 碼 更 容 易 閱 讀 系 統 更 容 易 維 護 和 擴 充 就 如 同 上 述 的 例 子, 在 這 本 書 中, 我 們 將 強 調 C/C++ 與 這 類 解 題 實 務 的 聯 繫, 而 不 僅 就 一 個 電 腦 語 言 的 技 術 內 容 作 介 紹 對 於 多 數 沒 有 機 會 進 一 步 學 習 計 算 機 結 構 演 算 法 資 料 結 構, 或 是 軟 體 工 程 等 高 階 電 腦 課 程 的 理 工 科 系 學 生 來 說, 這 樣 的 安 排 無 疑 是 較 為 妥 適 且 實 用 的 程 式 設 計 的 目 標 在 於 解 題 (Problem Solving) 如 何 評 價 一 個 程 式 設 計 人 員? 不 同 技 術 領 域 和 時 空 背 景 可 能 會 有 不 同 的 觀 點 和 標 準, 但 有 一 個 指 標 幾 乎 所 有 人 都 同 意 的, 那 就 是 : 一 個 好 的 程 式 設 計 人 員 必 須 具 有 應 用 電 腦 程 式 來 解 決 實 務 問 題 的 能 力 解 決 實 務 問 題 能 力 的 培 養 不 全 然 靠 經 驗 事 實 上, 它 更 應 該 是 建 立 在 一 個 結 合 了 理 論 方 法 工 具 的 一 個 有 條 理 的 流 程, 它 可 以 指 引 工 程 師 用 一 種 嚴 謹 的 系 統 化 的 方 式 去 解 決 類 似 的 甚 至 一 個 從 未 被 解 決 過 的 問 題 本 書 在 介 紹 每 一 個 主 題 或 每 一 個 語 法 時, 都 會 伴 隨 一 個 範 例 程 式, 來 展 示 一 個 解 題 的 類 型 (pattern), 接 著 每 一 節 結 束 時 都 有 即 時 演 練 的 題 目, 得 以 讓 學 習 者 藉 由 前 面 的 類 型 範 例, 參 考 其 解 題 程 序 比 如 宣 告 變 數 給 定 初 值 應 用 適 當 的 流 程 控 制 語 法 結 果 輸 出 等, 來 完 成 相 似 的 解 題 程 式 的 設 計 極 簡 主 義 的 設 計 哲 學 設 計 一 個 工 業 系 統 或 計 算 系 統, 有 很 多 的 品 質 評 量 方 式, 例 如 性 能 效 率 可 靠 度 程 式 碼 大 小 記 憶 體 使 用 量 等 等, 很 少 有 程 式 能 夠 同 時 滿 足 所 有 的 目 標, 因 此 就 有 各 種 程 式 設 計 的 技 巧 使 用 這 些 技 巧 確 實 對 程 式 設 計 者 達 成 特 殊 需 求 的 系 統 設 計 有 很 大 的 幫 助 但 是 另 一 方 面, 過 於 強 調 這 些 技 巧 反 而 經 常 造 成 初 學 者 的 學 習 上 的 障 礙 因 為 它 們 多 數 不 容 易 結 構 化 程 式 碼 不 容 易 閱 讀 程 式 除 錯 困 難 以 及 日 後 程 式 的 修 改 和 擴 充 困 難 在 這 個 背 景 下, 簡 單 (simplicity) 反 而 突 顯 出 重 大 的 優 點 簡 單 的 程 式 碼 風 格 讓 程 式 更 符 合 程 式 設 計 者 和 應 用 系 統 開 發 者 的 直 覺, 因 此 容 易 閱 讀 和 溝 通, 也 得 以 設 計 出 更 可 靠 的 更 容 易 維 護 擴 充 的 程 式 模 組, 此 外, 整 體 程 式 開 發 的 時 間 更 因 而 縮 短 如 何 設 計 簡 單 的 C/C++ 程 式? 一 個 參 考 原 則 是 : 不 要 過 於 倚 賴 特 殊 指 令 和 技 法, 而 用 直 覺 而 且 清 晰 的 方 式 來 撰 寫 程 式 例 如 避 免 使 用 goto 指 令 ; 少 用 遞
迴 (recursive) 結 構 ; 可 以 使 用 for 迴 圈 的 地 方 就 不 要 使 用 while 迴 圈 ; 儘 量 少 用 指 標 (pointer); 使 用 結 構 化 的 資 料 結 構 陣 列 (array) 來 取 代 其 他 如 List 之 類 複 雜 的 資 料 結 構 等 等 簡 單 的 程 式 風 格 並 不 總 是 意 味 犧 牲 程 式 的 效 率, 相 反 的, 由 於 結 構 清 晰, 很 容 易 依 據 新 的 任 務 需 求 去 調 整 程 式 碼 一 般 而 言, 我 們 的 程 式 都 是 在 個 人 電 腦 上 撰 寫 編 譯 和 執 行 一 旦 需 要 將 程 式 移 植 到 嵌 入 式 系 統 (embedded system) 平 台, 執 行 速 度 程 式 碼 大 小 和 記 憶 體 使 用 量 可 能 會 變 成 關 鍵 性 的 考 量, 此 時, 一 個 簡 單 清 晰 的 原 始 碼 將 使 我 們 針 對 最 佳 化 的 目 標 進 行 修 改 和 測 試 變 得 更 容 易 本 書 並 非 提 倡 學 習 簡 單 的 程 式 設 計, 相 反 的, 我 們 的 理 念 是 以 儘 可 能 簡 單 的 方 式 來 撰 寫 最 複 雜 的 解 題 程 式 簡 單 也 不 是 理 所 當 然, 這 種 能 力 必 須 經 由 學 習 得 來 本 書 以 很 大 的 努 力 來 協 助 讀 者 進 行 這 樣 的 學 習 為 什 麼 學 習 C/C++? C 語 言 在 程 式 設 計 和 電 腦 應 用 系 統 開 發 的 領 域, 有 著 無 可 比 擬 的 重 要 地 位 實 際 上, 幾 乎 所 有 當 代 電 腦 程 式 語 言 例 如 Perl Java C++ C #, 幾 乎 都 建 立 在 C 語 言 的 基 礎 上 小 從 智 慧 型 手 機 或 PDA 裏 執 行 的 作 業 系 統, 到 個 人 電 腦 Unix 工 作 站, 到 超 級 電 腦 內 部, 絕 大 部 分 所 採 用 的 作 業 系 統 都 是 以 C 語 言 開 發 出 來 的 80 年 代 以 後, 軟 體 開 發 的 複 雜 度 大 幅 提 高, 傳 統 C 語 言 不 再 能 夠 滿 足 大 型 軟 體 系 統 設 計 的 需 求, 因 此 誕 生 了 物 件 導 向 的 C++ 語 言, 它 在 C 語 言 的 語 法 裏 添 加 了 許 多 物 件 導 向 程 式 設 計 的 元 素 由 於 C++ 語 言 向 上 相 容 C 語 言, 因 此 多 數 的 編 繹 器 (compiler) 都 是 同 時 支 援 C 語 言 程 式 C++ 語 言 程 式 和 C/C++ 混 合 語 言 程 式 的 編 繹 工 作 在 內 容 的 安 排 上, 本 書 融 合 了 C 語 言 與 C++ 語 言 的 語 法 由 於 C++ 語 言 是 C 語 言 的 後 繼 者, 所 以 C++ 語 言 擁 有 許 多 比 C 語 言 優 越 的 特 徵, 譬 如 物 件 導 向 程 式 語 法 的 支 援 串 流 型 態 的 輸 入 輸 出, 但 另 一 方 面,C++ 語 言 同 時 也 形 成 了 更 複 雜 龐 大 的 語 言 結 構, 對 初 學 者 或 者 和 工 業 界 從 事 嵌 入 式 系 統 設 計 的 工 程 師 來 說, C++ 程 式 似 乎 是 一 個 不 合 時 宜 的 龐 然 怪 獸, 他 們 多 數 寧 可 選 擇 C 語 言, 來 撰 寫 小 巧 但 是 實 用 的 程 式 為 了 精 簡 的 目 的, 本 書 並 不 疊 加 C 語 言 和 C++ 語 言 的 內 容, 而 是 基 於 設 計 實 務 的 需 求, 以 C 語 言 為 基 礎 架 構, 再 加 上 選 擇 性 的 C++ 語 言 的 部 分 語 法 特 徵 加 以 延 伸, 整 合 成 本 書 的 骨 幹 書 中, 我 們 多 數 採 用 C++ 的 串 流 型 態 (streaming) 的 輸 入 輸 出 來 取 代 C 語 言 的 格 式 化 (formatting) 輸 入 輸 出, 因 為 它 讓 程 式 更
精 簡 更 容 易 撰 寫 和 使 用 另 外, 我 們 也 採 用 C++ 的 動 態 記 憶 體 配 置 方 法, 也 是 因 為 它 比 傳 統 C 語 言 的 記 憶 體 管 理 方 法 更 容 易 使 用, 同 時 具 有 更 大 的 彈 性 本 書 的 第 8 章 介 紹 C++ 的 物 件 導 向 的 程 式 設 計, 對 於 C 語 言 設 計 者 來 說, 這 是 一 個 全 新 的 主 題 我 們 考 量 物 件 導 向 方 法 可 以 為 一 個 大 型 複 雜 的 系 統 設 計 帶 來 模 組 化 的 好 處, 但 基 於 作 為 入 門 教 科 書 的 簡 易 性 考 量, 我 們 也 省 略 了 一 些 過 於 精 細 的 物 件 導 向 技 巧, 例 如 多 重 繼 承 等 這 類 主 題 即 使 不 是 沒 有 機 會 使 用, 我 們 也 不 建 議 在 一 個 講 求 精 簡 效 率 和 可 靠 性 的 工 程 計 算 導 向 問 題 中 使 用 這 些 高 階 但 相 對 複 雜 的 物 件 導 向 技 巧 長 久 以 來, 工 業 界 絕 大 多 數 的 工 程 系 統 都 是 以 C/C++ 語 言 進 行 開 發, 因 此 相 對 於 其 他 電 腦 語 言,C/C++ 相 關 的 參 考 資 源 最 為 豐 沛, 很 多 的 解 題 類 型 和 演 算 法 都 很 容 易 找 到 C/C++ 的 參 考 程 式 碼, 加 上 最 為 廣 泛 的 平 台 支 援, 包 括 8051 微 控 制 器 ARM 系 統 單 晶 片 MAC/PC 個 人 電 腦 工 作 站 等 等, 無 一 不 支 援 C/C++ 程 式 設 計 1995 年 以 來, 由 於 網 路 應 用 程 式 開 發 和 跨 平 台 運 算 的 潮 流, 帶 動 了 一 個 新 的 程 式 語 言 Java 的 興 起 但 是 C/C++ 語 言 的 需 求 並 沒 有 因 為 消 退, 反 而 由 於 所 謂 的 後 PC 時 代, 系 統 設 計 的 平 台 從 PC 移 轉 到 各 類 資 訊 家 電 的 嵌 入 式 系 統, 甚 至 移 轉 到 IC 設 計 領 域 的 SoC, 其 中 軟 體 和 軔 體 (firmware) 的 設 計,C/C++ 語 言 都 扮 演 著 愈 形 重 要 的 角 色 如 何 使 用 這 本 書? 針 對 所 有 初 學 者, 我 們 建 議 從 第 1 章 到 第 8 章 循 序 漸 進 的 學 習, 學 習 過 程 中, 一 面 參 考 範 例 程 式, 瞭 解 指 令 和 相 關 語 法 的 應 用, 並 藉 以 熟 悉 解 題 程 序 ; 接 著 會 有 相 同 類 型 的 練 習 題, 只 要 將 範 例 程 式 稍 加 改 寫, 應 該 很 容 易 解 決 這 些 練 習, 所 以 本 書 並 未 附 上 這 些 練 習 題 的 解 答 程 式 碼 本 書 每 一 章 結 束 都 有 一 些 綜 合 程 式 練 習, 讀 者 可 以 自 我 測 驗 是 否 對 於 整 章 的 內 容 有 充 分 的 掌 握 至 於 第 4 7 章 之 後, 我 們 提 供 了 許 多 精 選 的 程 式 實 務 演 練 程 式, 讀 者 可 以 先 自 行 撰 寫 解 題 程 式, 再 比 對 書 中 提 供 的 解 題 程 式 任 何 的 題 目 都 不 會 有 唯 一 的 解 答, 儘 量 以 不 同 的 思 考 邏 輯 和 嘗 試 不 同 的 語 法 去 解 題, 因 為 越 多 元 的 解 題 策 略 和 思 考 方 向 越 能 夠 厚 實 未 來 解 題 的 實 力 對 於 有 程 式 設 計 經 驗 的 工 程 師, 本 書 提 供 了 許 多 設 計 參 考 方 案, 讀 者 可 以 選 擇 感 興 趣 的 主 題, 學 習 範 例 程 式 的 解 題 方 法 ; 或 者 可 將 本 書 作 為 工 作 時 的 隨 身 參 考 手 冊 至 於 未 來 想 從 事 嵌 入 式 系 統 設 計 或 系 統 單 晶 片 (System-On-A-Chip) 設 計 的 工 程 師 們, 除 了 上 述 的 學 習 目 標 外, 我 們 希 望 他 們 還 可 以 從 本 書 學 習 到 精 簡 可 靠 的 程 式 撰 寫 風 格 這 對 他 們 未 來 在 快 速 產 品 上 市 (Time-To-Market) 的 壓 力
下 從 事 系 統 設 計 會 有 很 大 幫 助