Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Beijing • Cambridge • Farnham • K�ln • Sebastopol • Tokyo
深入淺出 C如果有一本書能夠讓 C 語言比太
空梭操作手冊更容易瞭解,而不會讓
人恨不得把電腦砸爛,那該有多好!
或許這只是我的純情青春夢吧…
David GriffithsDawn Griffiths
楊仁和 譯
fm.indd 5 2012/10/18 上午 02:26:00
目錄
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
目錄
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
目錄
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
目錄
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
目錄
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
目錄
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
目錄
xv
目錄目錄
可曾希望你所栽種的植物在它們需要澆水時能夠告訴你
嗎?嗯,有了 Arduino,就能夠辦到這件事﹗在這個實驗
裡,你將建造有 Arduino 加持的植物監視器,完全以 C 語
言編程喔。
C 實驗一Arduino
言編程喔。
fm.indd 15 2012/10/18 上午 02:26:17
目錄
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
目錄
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
目錄
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
目錄
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
目錄
xx
目錄目錄
想像一下,假如你的電腦能夠在你外出時監看你的房子,
並且告訴你誰曾在週遭徘徊。在這個實驗裡,你將利用
OpenCV 的聰明機巧,建造出有 C 語言加持的入侵者偵
測器。
C 實驗二OpenCV
測器。
fm.indd 20 2012/10/18 上午 02:26:41
目錄
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
目錄
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
目錄
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
目錄
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
目錄
xxv
目錄目錄
在這個實驗中,你即將向最受歡迎且最常青的電玩遊戲之
一表達你的無上敬意。現在,讓我們撰寫 Blasteroids(太
空守衛戰)吧﹗
C 實驗三Blasteroids
fm.indd 25 2012/10/18 上午 02:26:49
目錄
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
目前位置 4 xxvii
序
如何使用本書
序
在本節中,我們要回答一個頗為棘手的問題:
『為什麼把這樣的內容放進這本 C 語言的書籍裡?』
真不敢相信,他們竟
然在 C 語言的書裡放
進這些玩意兒!
這本書適合你嗎?
這本書適合任何買
得起的人,送禮自
用兩相宜。
fm.indd 27 2012/10/18 上午 02:26:54
xxviii 序
如何使用本書
誰適合閱讀這本書?
誰或許應該遠離這本書?
如果下列問題的答案全都是「肯定」的:
如果你對下列任何一個問題的答案是「肯定」的:
那麼,這本書就是為你量身打造的。
那麼,這本書就不適合你。
[ 行銷部門註解:亂亂講,這本書適合任何有信用卡或現金的人…支票也收啦!]
喜歡實際動手做並且運用你所學到的東西,勝過枯燥
乏味的學術性演講嗎?
你想要精通 C 語言,建立能夠引領風騷的軟體,好好發一筆橫財,然後買個私人小島,過著悠哉悠哉的退
休生活嗎?
你正在尋找有關 C 語言的粗淺概論或者參考手冊?
你已經會使用其他程式語言寫程式嗎?
你害怕嘗試不同的事物?寧可讓一群驚聲尖叫的猴子
拔你的腳趾甲,也不願意學習新事物?認為 C 語言的書籍就得中規中矩且包山包海?即使在閱讀過程中讓
讀者無聊到掉眼淚也無可厚非?
這樣講或許太誇張,但千里
之行起於足下,凡事總有個
開端嘛!
3
1
2
1
2
fm.indd 28 2012/10/18 上午 02:26:54
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
目前位置 4 xxxv
序
不要略過任何活動。
習題與活動並非附加的裝飾品,而是本書核心內容的一部分,有些可以幫助
記憶,有些可以幫助理解,還有一些可以幫助應用。所以,請不要略過這些習
題。
重複是刻意且必要的。
我們冀望 H e a d F i r s t 系列能夠讓你真正學到東西,希望你讀完本書之後,能夠記住所讀過的內容,大部分參考用書並不是以此為目標。本書的重點放在學
習,所以,某些重要內容會一再出現,加深你的印象。
程式範例盡量精簡。
我們的讀者告訴我們,不希望看到書中列出兩百行的程式碼,而當中和主題
有關的關鍵程式碼卻只有兩行。本書盡量把程式碼縮短,讓學習的過程清晰簡
單。不要期待所有的程式碼都很強健或完整,畢竟我們的程式碼是作為輔助學
習之用,不見得一定功能完備。
「動動腦」習題沒有答案。
有些「動動腦」習題沒有一定的答案,有些則讓你自行判斷你的答案是否正
確,以及何時正確。在一些「動動腦」習題中,我們會給你提示,指引你正確
的方向。
fm.indd 35 2012/10/18 上午 02:26:59