23
Beijing Cambridge Farnham Kln Sebastopol Tokyo 深入淺出 C 如果有一本書能夠讓 C 語言比太 空梭操作手冊更容易瞭解,而不會讓 人恨不得把電腦砸爛,那該有多好! 或許這只是我的純情青春夢吧… David Griffiths Dawn Griffiths 楊仁和

楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

Beijing • Cambridge • Farnham • K�ln • Sebastopol • Tokyo

深入淺出 C如果有一本書能夠讓 C 語言比太

空梭操作手冊更容易瞭解,而不會讓

人恨不得把電腦砸爛,那該有多好!

或許這只是我的純情青春夢吧…

David GriffithsDawn Griffiths

楊仁和 譯

fm.indd 5 2012/10/18 上午 02:26:00

Page 2: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

ix

目錄(精要版)

目錄(詳實版)

將你的心思放在 C  語言上。此時,你正試著學習某些東西,而你的

大腦也在幫助你確保學習活動不會被卡住。然而,你的大腦卻總是在

想,「最好留點空間給更重要的事,譬如說,油電價格會不會持續上

漲?跟阿娜達來趟單車三橫一豎環島是不是個好主意?」那麼,要如

何哄誘你的大腦,讓它認為學好 C 語言才是一件生死攸關的大事?

誰適合讀這本書? xxvi i i

我們瞭解你在想什麼 xxix

後設認知 xxxi

讓你的大腦順從你 xxxi i i

讀我 xxxiv

技術審閱小組 xxxvi

誌謝 xxxvi i

序 xxvi i1 千里之行起於足下:開始探索 C 語言 12 記憶體與指標︰你在指什麼? 41 2.5 字串︰字串理論 83 3 建立小工具︰做一件事並且把它做好 103 4 使用多個原始碼檔案︰分解它,逐漸加強它 157 C 實驗一︰Arduino 207 5 Struct,Union 和 Bi t f ie ld︰產生你自己的結構 217 6 資料結構和動態記憶體︰建立橋接 2677 函式進階︰發揮函式的強大威力 311 8 靜態與動態程式庫︰可熱切換的程式碼 351 C 實驗二︰OpenCV 389 9 行程與系統呼叫︰打破疆界 397 10 行程間通訊︰好好溝通 429 11 Socket 與網路連接︰虛擬的 127.0.0.1 467 12 執行緒︰並行發展的世界 501 C 實驗三︰Blasteroids 523 i 本書遺珠︰我們未涵蓋的十件事 539 i i C 語言主題︰總整理 553

fm.indd 9 2012/10/18 上午 02:26:02

Page 3: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

x

C 語言係針對小而快的程式而設計 2

但完整的 C 語言程式看起來如何? 5

你如何執行程式? 9

兩類命令 14

目前的程式碼 15

算牌?用 C 語言? 17

布林值不只有相等⋯ 18

程式碼現在如何? 25

switch 陳述式 26

有時候一次並不夠⋯ 29

迴圈經常遵循相同的結構⋯ 30

使用 break 中斷⋯ 31

你的 C 語言工具箱 40

開始探索 C 語言1千里之行起於足下

想要瞭解電腦的想法嗎?   

需要為新遊戲撰寫高效能程式碼?編程 A rd u i n o?或者在你的 i P h o n e 應用

程式中使用進階的第三方程式庫?假如是這樣的話,C 語言正是你可以仰仗

的好伙伴。相較於大多數其他程式語言,C 語言的工作層級確實更接近底層,

因此,瞭解 C 語言勢必能夠讓你更貼近你的電腦,更清楚底層所發生的事

情,甚至,C 語言還能夠幫助你更加瞭解其他語言。因此,抓緊你的編譯器,

我們馬上就要展開這一段美妙的豐富之旅。

1

fm.indd 10 2012/10/18 上午 02:26:04

Page 4: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xi

你在指什麼?假如你真想要搞定  C  語言,就必須瞭解  C  語言怎樣處理

記憶體。   

C 語言允許你針對程式如何使用電腦記憶體做許多控制,在本章中,你會掀

開這層神祕的簾幕,看清楚在你讀寫變數時究竟發生什麼事。你將學到陣列

如何運作,以及如何避免一些骯髒的記憶體混亂,尤其是,你將明白掌握指

標和記憶體定址為何是讓你成為 C 語言程式高手的重要關鍵。

記憶體與指標

2C 程式碼包含指標 42

深入記憶體 43

帶著指標啟航吧 44

試著傳遞指向變數的指標 47

使用記憶體指標 48

如何傳遞字串給函式? 53

陣列變數像指標⋯ 54

執行你的程式碼時,電腦在想什麼 55

但陣列變數不完全是指標 59

為什麼陣列實際上從 0 開始索引 61

為什麼指標有型別 62

把指標應用於資料輸入 65

小心 scanf() 66

fgets() 是 scanf() 的替代方案 67

字串實字永遠不能被更新 72

如果你打算改變字串,就產生一份副本 74

記憶體存儲器 80

你的 C 語言工具箱 81

xi

3132

latitude

4,100,000

出發 !

報告船長,

順風 !

起錨 !

fm.indd 11 2012/10/18 上午 02:26:10

Page 5: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xii

字串理論

字串不只用來讀取。 

你已經知道 C 語言裡的字串實際上是字元陣列,但是 C 語言允許你用它們來

做什麼呢?那正是 string.h 能夠插上手的地方。str ing.h 是 C 語言標準程式

庫的一部分,主要用來進行字串操作。如果你想要串接字串,複製字串,或

比較二個字串, s t r i n g . h 裡的函式都可以幫上忙。在本章裡,你將看到如何

建立字串陣列,然後仔細檢視一下如何使用 strstr ( ) 函式針對字串進行搜尋。

字串

2.5

拼命尋找 Frank 84

建立陣列的陣列 85

尋找包含搜尋文字的字串 86

使用 s t rs t r ( ) 函式 89

程式碼審查時間 94

陣列的陣列 vs . 指標陣列 98

你的 C 語言工具箱 101

比較字串

搜尋字串

複製字串

切割字串

string

.h

fm.indd 12 2012/10/18 上午 02:26:10

Page 6: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xiii

做一件事並且把它做好3建立小工具

每個作業系統都包含一些小工具。

用 C 語言撰寫的小工具執行一些專精的小任務,例如,讀寫檔案或過濾資料。如

果想要執行更複雜的工作,你甚至可以把幾個工具連結在一起。然而,這些小工

具如何被建造?在本章裡,你會看到建造小工具的建構區塊(b u i l d i n g b l o c k)

,你會學到如何控制命令列選項(c o m m a n d l i n e o p t i o n),如何管理資訊串流

(stream)與重導向(redirect ion),並且馬上把一些小工具準備好。

標準輸入來自鍵盤

標準錯誤被送到螢幕展示

標準輸出被送到

螢幕展示

小工具能解決大問題 104

程式該如何運作 108

但你不是使用檔案⋯ 109

你能夠使用重導向 110

介紹標準錯誤 120

預設上,標準錯誤被送到螢幕展示 121

fpr intf() 輸出到資料串流 122

讓我們更新程式碼以使用 fpr intf() 123

小工具有彈性 128

不要改變 geo2json 工具 129

不同任務需要不同工具 130

使用管線連接你的輸入和輸出 131

bermuda 工具 132

但萬一你想要輸出到多個檔案呢? 137

產生你自己的資料串流 138

main() 不只如此 141

讓程式庫為你效勞 149

你的 C 語言工具箱 156

fm.indd 13 2012/10/18 上午 02:26:12

Page 7: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xiv

分解它,逐漸加強它

如果你建立的是一支大程式,你不會想要弄出一個臃腫不

堪的原始碼檔案。

你能夠想像單一原始碼檔案的企業級程式維護起來會有多困難且多費時嗎?

在本章裡,你將學習到 C 語言如何讓你把原始碼分解成一個個容易管理的小

區塊,然後再將它們重新建置(bu i l d)成巨大的程式。在整個過程中,你將

學到更多關於資料型別的微妙之處,並且見見你最好的新朋友︰make。

使用多個原始碼檔案

4

資料型別快速指南 162

別把大東西放進小容器 163

使用強制轉型把浮點數放進整數 164

噢⋯等通告的演員們⋯ 168

讓我們看看程式碼發生什麼事 169

編譯器不喜歡意外的驚奇 171

將定義與宣告分開 173

建立你的第一個標頭檔 174

如果你有通用的功能⋯ 182

你能夠將程式碼分割到不同的檔案 183

幕後的編譯 184

共用的程式碼需要自己的標頭檔 186

這不是火箭科學⋯或者是? 189

不要重新編譯每個檔案 190

首先,把原始碼編譯成目的檔 191

很難追蹤記錄這些檔案 196

使用 make 工具自動化你的建置工作 198

make 如何運作 199

使用 makefi le 提供程式碼的相關資訊給 make 200

發射﹗ 205

你的 C 語言工具箱 206

gcc -o

gcc -c

fm.indd 14 2012/10/18 上午 02:26:15

Page 8: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xv

目錄目錄

可曾希望你所栽種的植物在它們需要澆水時能夠告訴你

嗎?嗯,有了 Arduino,就能夠辦到這件事﹗在這個實驗

裡,你將建造有 Arduino 加持的植物監視器,完全以 C 語

言編程喔。

C 實驗一Arduino

言編程喔。

fm.indd 15 2012/10/18 上午 02:26:17

Page 9: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xvi

有時候你必須處理大量資料 218

小組溝通 219

用 s t ruct 建造你自己的資料型別 220

就給它們魚 221

使用“ .”運算子讀取 s t ruct 的欄位 222

你能夠把一個 s t ruct 放進另一個嗎? 227

如何更新 s t ruct? 236

程式碼正在複製 (c lone) 烏龜 238

你需要指向 s t ruct 的指標 239

(*t) .age vs . *t .age 240

有時候,相同類型的事物需要不同類型的資料型別 246

union 允許你重利用記憶體空間 247

如何使用 union? 248

enum 變數儲存符號 255

有時候你想要控制位元層級 261

bi t f ie ld 儲存自訂數目的位元 262

你的 C 語言工具箱 266

產生你自己的結構5Struct,Union 和 Bitfield

現實生活裡的大多數事物都比簡單的數字來得複雜。

目前為止,你已經看過 C 語言的基本資料型別,但萬一你想要的不只是數

字與文字片段,並且還想要塑模真實世界裡的事物呢?struct 讓你透過撰

寫自己的結構來塑模真實世界的複雜性。在本章裡,你將學到如何將基本

資料型別結合成 s t r u c t,甚至使用 u n i o n 處理生活中的不確定性。另外,

如果你要的只是簡單的是或否,bitfield 可能是你需要的東西。

bitf ie ld 儲存自訂數目的位元 262

你的 C 語言工具箱 266

這是 Myrtle…

…但它的複製品被送給函式。

Turtle “t”

fm.indd 16 2012/10/18 上午 02:26:19

Page 10: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xvii

建立橋接有時候,單一 struct 就是不夠用。   

要塑模複雜的資料需求,通常需要連結多個 struct。在本章裡,你將看到如

何使用 struct 指標 ( struct pointer) 將自訂資料型別連結成複雜而龐大的資料

結構。你會透過建造鏈結串列 ( l inked l i st ) 探索關鍵原則,你也將看到如何透

過在  heap(堆積)中動態配置記憶體,讓你的資料結構能夠處理不固定數量

的資料,並且在工作完成時釋放它。另外,你也會瞭解當一些基本清理工作

變得詭譎混亂時,valgrind 如何能夠幫上忙。

資料結構和動態記憶體

6

Craggy

Isla Nublar

Shutter

xvii

heap 上位置 4,204,853 處的 32 位元組資料。

需要彈性的儲存嗎? 268

鏈結串列看起來像資料鏈 269

鏈結串列允許插入 270

建立遞迴結構 271

以 C 語言建造島嶼⋯ 272

把值插入串列 273

使用 heap 做動態儲存 278

工作完成時歸還記憶體 279

使用 mal loc() 要求記憶體⋯ 280

讓我們使用 s t rdup() 函式修正程式碼 286

使用完畢,釋放記憶體 290

SPIES 系統概述 300

軟體鑑識︰使用 valgr ind 302

反覆使用 valgr ind 收集更多證據 303

檢視證據 304

在嘗試中修正 307

你的 C 語言工具箱 309

fm.indd 17 2012/10/18 上午 02:26:33

Page 11: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xviii

尋找理想伴侶 312

傳遞程式碼給函式 316

你需要告訴 f ind() 關於函式的名稱 317

每個函式名稱都是一個指向函式的指標⋯ 318

⋯但沒有函式資料型別 319

如何建造函式指標 320

利用 C 語言標準程式庫作排序 325

使用函式指標設定順序 326

自動化分手信 334

建造函式指標陣列 338

讓你的函式有彈性 343

你的 C 語言工具箱 350

發揮函式的強大威力7函式進階

基本函式很棒,但有時你需要的更多。   

目前為止,你聚焦在一些基礎知識上,但如果你需要更強大的威力與彈

性才能夠達成想要的目的呢?在本章裡,你將看到如何透過把函式當作

參數來傳遞而提高你的程式碼的智商。另外,你也會學到如何利用比較

器 (comparator)  函式來進行排序。最後,你將學到如何運用可變參數函

式 (var iadic funct ion) 讓你的程式碼變得超級靈活而有彈性。

測試機器

fm.indd 18 2012/10/18 上午 02:26:35

Page 12: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xix

可熱切換的程式碼

你已經見識過標準程式庫的強大威力。   

現在,該是為你自己的程式碼運用這種強大威力的時候了。在本章裡,你會

看到如何建立你自己的程式庫,並且跨多個程式重利用相同的程式碼。更

且,你會學到如何以動態程式庫在執行期間共用程式碼。你將瞭解編程專家

的秘密,並且,在本章最後,你將能夠撰寫出可以簡單且有效管理及縮放的

程式碼。

靜態與動態程式庫

8能夠用在銀行的程式碼 352 尖括號是針對標準標頭 354 但萬一你想要共用程式碼呢? 355 共用 .h 標頭檔 356 透過使用完整路徑名稱共用 .o 目的檔 357 收藏檔包含 .o 目的檔 358 使用 ar 命令建立收藏檔⋯ 359 最後,編譯你的其他程式 360 Head Firs t Gym 正邁向全球化 365 計算卡路里 366 但事情還要更複雜些⋯ 369 程式由許多片段組成⋯ 370 動態連結發生在執行期間 372 你能夠在執行期間連結 .a 嗎? 373 首先,建造目的檔 374 你的動態程式庫名稱取決於你的平台 375 你的 C 語言工具箱 387

是鳥嗎?還是飛機?不,是具有中介資料的可重配置的目的檔。

葡萄乾,麵粉,奶

油,鯷魚…

fm.indd 19 2012/10/18 上午 02:26:36

Page 13: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xx

目錄目錄

想像一下,假如你的電腦能夠在你外出時監看你的房子,

並且告訴你誰曾在週遭徘徊。在這個實驗裡,你將利用

OpenCV 的聰明機巧,建造出有 C 語言加持的入侵者偵

測器。

C 實驗二OpenCV

測器。

fm.indd 20 2012/10/18 上午 02:26:41

Page 14: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xxi

系統呼叫是你跟 OS 的熱線 398

然後有人闖進系統⋯ 402

安全性不是唯一的問題 403

exec() 函式賦予你更多控制權 404

有很多 exec() 函式 405

陣列函式︰execv(),execvp(),execve() 406

傳遞環境變數 407

大多數系統呼叫皆以同樣方式處理失敗 408

利用 RSS 讀取訊息 416

exec() 是你的程式的結尾 420

以 fork() 搭配 exec() 執行子行程 421

你的 C 語言工具箱 427

打破疆界9行程與系統呼叫

讓我們跳脫窠臼來思考吧。   

你已經知道你能夠透過在命令列上連結一些小工具來建造複雜的應用程

式,但萬一你想要在自己的程式碼裡使用其他程式呢?在本章裡,你將學

到如何利用系統服務(system ser v ice)來建造及控制行程(process),

那樣就可以讓你的程式存取電子郵件,網際網路和已經安裝好的任何其

他工具。在本章結束時,你將有能力跨越 C 語言的既有疆界。

這是你的 newshound 行程

它針對三個 newsfeed

的每一個分別執行一

個獨立的行程。

三個子行程同時執行。

newshound

fm.indd 21 2012/10/18 上午 02:26:44

Page 15: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xxii

好好溝通

產生行程只是一半的故事。   

萬一你想要在行程執行時繼續控制它呢?萬一你想要把資料傳送給它呢?或

者讀取它的輸出呢?行程間通訊( I n te r p ro c e s s co m m u n i cat i o n)讓各個行

程協同工作。我們會告訴你如何透過讓它跟系統上的其他程式交談,讓你的

程式碼威力倍增。

行程間通訊

10重導向輸入和輸出 430

看看典型的行程 431

重導向只是替換資料串流 432

f i leno() 告訴你描述子 433

有時候,你必須等待⋯ 438

跟你的孩子們保持聯繫 442

使用管線連接你的行程 443

案例研究︰在瀏覽器裡打開報導 444

在子行程裡 445

在父行程裡 445

在瀏覽器裡打開網頁 446

行程之死 451

捕捉信號並且執行你自己的程式碼 452

s igact ion 以 s igact ion() 註冊 453

重寫程式碼使用信號處理器 454

使用 k i l l 傳送信號 457

叫醒你的程式碼 458

你的 C 語言工具箱 466

#include <stdio.h>

int main(){ char name[30]; printf("Enter your name: "); fgets(name, 30, stdin); printf("Hello %s\n", name); return 0;}

> ./greetingsEnter your name: ^C>

File Edit Window Help

假如你按下 Ctrl-C,程式停止執

行,但這是為什麼呢?

fm.indd 22 2012/10/18 上午 02:26:45

Page 16: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xxiii

網際網路 knock-knock 伺服器 468

knock-knock 伺服器概述 469

BLAB︰伺服器如何跟網際網路交談 470

socket 並非典型的資料串流 472

有時候,伺服器不正確地啟動 476

為什麼你老媽總是提醒你要檢查錯誤 477

讀取客戶端 478

該伺服器一次只能夠跟一個人交談 485

你能夠針對每個客戶 fork() 出一個行程 486

撰寫 Web 客戶端 490

客戶端主動出擊 491

針對 IP 位址建立 socket 492

getaddrinfo() 取得網域位址 493

你的 C 語言工具箱 500

虛擬的 127.0.0.111Socket 與網路連接

不同機器上的程式需要彼此溝通。

你已經知道如何使用 I /O 跟檔案溝通,以及相同機器上不同行程之間如何

彼此交流,現在,你即將更進一步跨越到世界的其他部分,並且學習如何

撰寫能夠跨網路與其他程式溝通的 C 程式。在本章結束時,你將能夠建立

行為如伺服器及行為如客戶端的程式。

伺服器同時跟幾個客戶端溝通。

客戶端與伺服器之間遵

循著一種結構化的交談方

式,稱作協定 (protocol)

伺服器

Telnet 客戶端

Telnet 客戶端

Telnet 客戶端

fm.indd 23 2012/10/18 上午 02:26:46

Page 17: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xxiv

並行發展的世界程式經常需要同時做幾件事。 

透過 POS IX 執行緒平行地執行幾個程式碼片段能夠讓你的程式變得更有回應

性,但千萬要小心﹗執行緒雖是威力強大的工具,卻也是暗藏危機的利器,

你不會想要它們把彼此弄到當機。在本章裡,你將學習如何安排交通號誌及

車道標識來防止程式碼發生堵塞。最後,你會知道如何建立執行緒,以及如

何運用同步機制( sy n c h ro n i za t i o n m e c h a n i s m)來保護敏感資料的完整性

( integr i ty)。

執行緒

12

共用變數

A

B交通號誌防止兩個執行緒同時存

取同一個共用變數。

這兩輛車子代表兩個執行緒,兩者皆想要存取共用變數。

任務是循序的⋯或者不是⋯ 502

⋯而且行程不總是答案 503

簡單的行程一次只做一件事 504

雇用額外人力︰多個執行緒 505

你如何建立執行緒? 506

用 p thread_create 建立執行緒 507

程式碼不是執行緒安全的 512

你需要增加交通號誌 513

使用 mutex 作為交通號誌 514

你的 C 語言工具箱 521

fm.indd 24 2012/10/18 上午 02:26:48

Page 18: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xxv

目錄目錄

在這個實驗中,你即將向最受歡迎且最常青的電玩遊戲之

一表達你的無上敬意。現在,讓我們撰寫 Blasteroids(太

空守衛戰)吧﹗

C 實驗三Blasteroids

fm.indd 25 2012/10/18 上午 02:26:49

Page 19: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目錄

xxvi

我們未涵蓋的十件事即使在所有章節討論完之後,仍然有些東西是我們未涵蓋

到的。我們認為還有幾件事情是你必須知道的,要是忽略它們,我們會覺

得很不自在。即使礙於篇幅的關係只能簡單提及,但我們還是會設法將它們

好好闡述一下。所以,在你放下書本之前,請再耐點性子,好好品嚐一下這

幾道美味佳餚。

本書遺珠

i#1 運算子 540

#2 預處理器指令 542

#3 s ta t ic 關鍵字 543

#4 材料有多大 544

#5 自動化測試 545

#6 更多關於 gcc 546

#7 更多關於 make 548

#8 開發工具 550

#9 建立 GUI 551

#10 參考資料 552

總整理

可曾希望所有這些 C 語言的好材料都能夠共聚一堂嗎?

這裡是本書所涵蓋之全部 C 語言主題與原則的總整理,好好檢視一下,看看

你是否能夠記住這一切。每一段材料都有它對應的章節,因此,假如你需要

提示的話,很容易就能夠參照回原有的說明,甚至,你可能會想要剪下這幾

頁,將它們貼在牆壁上或書桌前。

C 語言主題

ii

gcc

xxvi

556    appendix ii

processes and communication

Processes and communication

system() will run a string like a console command.

CHAP

TER

9

fork() duplicates the current process.

CHAP

TER

9

fork() + exec() creates a child process.

CHAP

TER

9

execl() = list of args.execle() = list of args + environment.

execlp() = list of args + search on path.

execv() = array of args.

execve() = array of args + environment.

execvp() = array of args + search on path.

CHAP

TER

9

Processes can communicate using pipes.

CHAP

TER

10

pipe() creates a communication pipe.

CHAP

TER

10

exit() stops the program immediately.

CHAP

TER

10

waitpid() waits for a process to finish.

CHAP

TER

10

fm.indd 26 2012/10/18 上午 02:26:52

Page 20: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目前位置 4 xxvii

如何使用本書

在本節中,我們要回答一個頗為棘手的問題:

『為什麼把這樣的內容放進這本 C 語言的書籍裡?』

真不敢相信,他們竟

然在 C 語言的書裡放

進這些玩意兒!

這本書適合你嗎?

這本書適合任何買

得起的人,送禮自

用兩相宜。

fm.indd 27 2012/10/18 上午 02:26:54

Page 21: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

xxviii 序

如何使用本書

誰適合閱讀這本書?

誰或許應該遠離這本書?

如果下列問題的答案全都是「肯定」的:

如果你對下列任何一個問題的答案是「肯定」的:

那麼,這本書就是為你量身打造的。

那麼,這本書就不適合你。

[ 行銷部門註解:亂亂講,這本書適合任何有信用卡或現金的人…支票也收啦!]

喜歡實際動手做並且運用你所學到的東西,勝過枯燥

乏味的學術性演講嗎?

你想要精通 C 語言,建立能夠引領風騷的軟體,好好發一筆橫財,然後買個私人小島,過著悠哉悠哉的退

休生活嗎?

你正在尋找有關 C 語言的粗淺概論或者參考手冊?

你已經會使用其他程式語言寫程式嗎?

你害怕嘗試不同的事物?寧可讓一群驚聲尖叫的猴子

拔你的腳趾甲,也不願意學習新事物?認為 C 語言的書籍就得中規中矩且包山包海?即使在閱讀過程中讓

讀者無聊到掉眼淚也無可厚非?

這樣講或許太誇張,但千里

之行起於足下,凡事總有個

開端嘛!

3

1

2

1

2

fm.indd 28 2012/10/18 上午 02:26:54

Page 22: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

xxxiv 序

如何使用本書

讀我

這是一段學習體驗,而不是一本參考書,所有阻礙學習的東西,都已經被刻意排除

掉。第一次閱讀時,你必須從頭開始,因為本書對讀者的知識背景做了一些假設。

我們假設你是 C 語言新手,但不是編程菜鳥。

我們假設你寫過一點程式,不用多,但應該已經從別的程式語言(如 JavaScript)中瞭解到迴圈和變數之類的東西。C 語言確實是相當進階的語言,因此,假如你完全沒做過任何編程,在你開始閱讀本書之前,最好找些相關書籍先看看,建議你可

以從 《Head Firs t Programming》(深入淺出程式設計)開始。

你必須先在你的電腦上安裝 C 編譯器。

貫穿本書,我們會使用 Gnu Compiler Col lect ion (gcc),因為它是免費的,而且,嗯,我們認為它是一個相當不錯的編譯器。你必須確認有將 g c c 安裝在你的機器上。好消息是,如果你使用的是 L i n u x 電腦,那上頭應該已經有 g c c。如果你使用的是 Mac 電腦,你將需要安裝 Xcode /Dev e lope r 工具,你可以從 A p p l e App Store 或 Apple 的網站上下載它們。如果你使用的是 Windows 機器,你有二種選擇,Cygwin (ht tp: / /www.cygwin.com) 提供你完整的 Unix 環境模擬,並且包含 g cc,但如果你想要建立直接運作在 Windows 上的程式,那麼你可能會想要安裝 Minimalis t GNU for Windows (MingW),請參考 h t tp: / /www.mingw.org。

本書所有的程式碼皆能夠跨上述各個作業系統而運作,而且我們努力避免撰寫出只

能夠跑在某種電腦上的程式碼。雖然偶爾會有一些例外,但我們會確切地告訴你。

我們從 C 語言的一些基本概念談起,隨即開始使用 C 語言為你工作。

我們在第 1 章裡涵蓋 C 語言的基礎知識,因此,在進入第 2 章之前,你就能夠建立程式,實際做一些真正有用且有趣的事情。然後,本書其餘部分將強化你的 C 語言技術,讓你從 C 語言的新手很快變成編程高手。

fm.indd 34 2012/10/18 上午 02:26:59

Page 23: 楊仁和 譯 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/A309.pdf · 目錄. x. C 語言係針對小而快的程式而設計 2 但完整的 C 語言程式看起來如何? 5 你如何執行程式?

目前位置 4 xxxv

不要略過任何活動。

習題與活動並非附加的裝飾品,而是本書核心內容的一部分,有些可以幫助

記憶,有些可以幫助理解,還有一些可以幫助應用。所以,請不要略過這些習

題。

重複是刻意且必要的。

我們冀望 H e a d F i r s t 系列能夠讓你真正學到東西,希望你讀完本書之後,能夠記住所讀過的內容,大部分參考用書並不是以此為目標。本書的重點放在學

習,所以,某些重要內容會一再出現,加深你的印象。

程式範例盡量精簡。

我們的讀者告訴我們,不希望看到書中列出兩百行的程式碼,而當中和主題

有關的關鍵程式碼卻只有兩行。本書盡量把程式碼縮短,讓學習的過程清晰簡

單。不要期待所有的程式碼都很強健或完整,畢竟我們的程式碼是作為輔助學

習之用,不見得一定功能完備。

「動動腦」習題沒有答案。

有些「動動腦」習題沒有一定的答案,有些則讓你自行判斷你的答案是否正

確,以及何時正確。在一些「動動腦」習題中,我們會給你提示,指引你正確

的方向。

fm.indd 35 2012/10/18 上午 02:26:59