本書既詳細講解C語言的基礎編程知識和技巧,又涵蓋Xcode的使用方法,并且針對最新的C標準做了更新,包含大量疽的代碼示例。
經典暢銷書全新升級,全面且深入地講解Mac環境下C編程的各項知識,是從零開始系統學習C編程的首選
既詳細講解C語言的基礎編程知識和技巧,又涵蓋Xcode的使用方法,并且針對最新的C標準做了更新,包含大量實用的代碼示例。
歡迎閱讀本書
歡迎!既然已經開始閱讀本書,那就說明你肯定喜歡Mac。不僅喜歡Mac,你肯定還想學習如何設計并開發出自己的Mac程序。
那你真是找對書了。
本書假定你已經知道如何使用Mac,知道這就夠了。你無須了解任何編程知識,一點兒都不需要。我們會從基礎知識開始,每次前進一小步,從而確保你已經沒有任何問題了。
本書將重點討論編程基礎。與此同時,你還將學習到C編程語言的核心。
在Douglas Adam的《The Hitchhiker’s Guide to the Galaxy》一書中,“生命、宇宙與一切的終極問題”的答案是“42”。當然,這個答案是不對的,正確答案應該是“C”。
C語言是軟件開發的源泉。過去半個世紀以來,計算機與消費電子產品領域的重要變革很大程度上都是通過C語言、衍生自C的語言(Objective-C、C++)以及根據C設計的語言(Java、C#)實現的。學習C吧,程序世界將成為你的囊中之物。
Douglas Adams是個狂熱的Mac愛好者。
學習完本書后,你就可以開始學習面向對象編程與Objective-C了——OS X與iOS的官方編程語言。
聽起來有點難以應付吧?沒關系,本書將采取小步前進的方式,大家都能跟得上,你當然也沒問題!
本書讀者對象
當Dave在1991年寫下本書第1版時,他是寫給大學生看的。畢竟,他就是在大學時開始學習編程的,但事實證明他錯了。
“頭一次感覺我低估了我的讀者是在收到一封5年級學生寫的郵件時,他已經讀完了全書。5年級啊!不止一個,還有很多9歲、10歲、11歲的小朋友已經開始學習編程了,這簡直太酷了!最棒的是這些小朋友發給我他們實際編寫的應用時,你無法想象我是多么驕傲和自豪。”
Dave發現了這其中的重要意義。隨著時間的流逝,我們收到來自于足球媽媽、愛好者,甚至普通人的郵件,他們開始使用Mac了,都從《Learn C on the Mac》起步,并且學有所成。
那么該如何起步呢?雖然僅僅通過讀書來學習C語言也是可行的,但是最好能夠實際運行每個示例程序,這樣才能有最大的收獲。要做到這一點,你需要一臺運行OS X(最好是10.6.8或更高的版本)的Mac并聯網。需要上網下載Apple為對Mac編程感興趣的人所提供的免費工具,還需要下載本書配套的項目。
重申一次,如果對編程一無所知,請不要擔心。本書前幾章將會帶你快速入門。如果已經具備了一些編程經驗(甚至還比較豐富),那就可以跳過前幾章,從第3章開始探究C語言基礎。
本書內容安排
下面來快速介紹本書的主要內容。
第1章介紹如何獲取本書將會用到的免費軟件工具。
第2章介紹構建計算機程序的一些基礎知識。
第3章介紹如何將一系列程序語句嵌入到可重用的函數中,這樣就可以不斷重復使用了。
第4章介紹變量與運算符,將強大的數學表達式引入到程序中。
第5章介紹如何逐行觀測程序的執行,以了解程序運行是否正確,如果不正確則可以即時修復。
第6章介紹流程控制的概念,使用if、else、do與while結構來控制程序的走向。
第7章介紹指針與參數,這兩個概念會將程序的水平提升到一個全新的高度。
第8章超越本書前半部分所用的簡單數據類型,介紹如何處理更復雜的數字以及數組和文本字符串之類的數據類型。
第9章介紹如何部署完成的程序以及如何通過命令行使用它。
第10章更加深入地介紹數據,同時還介紹如何設計自定義數據結構。
第11章引入數據文件的概念,介紹如何保存程序的數據,以及如何再將其讀取回來。
第12章介紹在程序出錯時該如何處理錯誤。
第13章介紹各種高階主題——強制類型轉換、聯合體、遞歸、排序、集合等。
最后,第14章對全書做了總結,并給出接下來的學習建議。
準備好了嗎?出發吧!
David Mark,是一位經驗豐富的Mac開發者與作者,曾編寫過大量關于Mac與iOS開發的圖書,包括《Beginning iPhone 4 Development》、《More iPhone 3 Development》、《Learn C on the Mac》和《Ultimate Mac Programming》等。David還是iOS與Android開發工作室MartianCraft的聯合創始人。
James Bucanek ,在過去30多年一直從事編程與微處理器系統的開發工作。他在眾多計算機硬件與軟件方面具有非常豐富的經驗,從嵌入式消費品到工業機器人。他的開發項目包括面向Apple II的首個局域網、分布式空調控制系統、鋼琴教學系統、數字示波器、硅片沉積裝置,以及針對中小學教育的協作式寫作工具。James目前主要關注OS X與iOS軟件開發,在這個領域中,他可以將自己深厚的UNIX知識與面向對象語言編程經驗凝結到優雅的設計中。
譯者序
作者簡介
技術審校者簡介
前言
致謝
第1章 獲取工具 1
1.1 安裝Xcode 1
1.2 Xcode的價格 2
1.3 何為注冊開發者 3
1.4 獲取項目 3
1.5 使用Xcode 3
1.5.1 新建Xcode項目 5
1.5.2 工作空間窗口 6
1.5.3 運行項目 7
1.6 繼續前進 8
第2章 編程基礎 9
2.1 編程 9
2.1.1 C語言的其他替代者 9
2.1.2 Objective-C、C#、C++及Java怎么樣呢 10
2.2 對于Mac或者iOS設備來說最佳編程語言是什么 10
2.3 編程過程 11
2.3.1 源代碼 11
2.3.2 編譯源代碼 13
2.3.3 構建應用程序 14
2.4 接下來的內容 14
第3章 C語言基礎:語句與函數 15
3.1 C語句 15
3.2 C函數 15
3.2.1 定義函數 16
3.2.2 語法錯誤與算法 17
3.2.3 調用函數 18
3.3 一個程序,兩個函數 20
3.3.1 Hello2項目 20
3.3.2 Hello2源代碼 22
3.3.3 運行Hello2 23
3.4 重復三次 24
3.5 產生一些錯誤 25
3.5.1 修復問題 26
3.5.2 再探細節 27
3.5.3 C是區分大小寫的 27
3.6 探究Xcode自帶的手冊 29
3.7 接下來的內容 30
第4章 C語言基礎:變量與運算符 32
4.1 變量簡介 32
4.1.1 使用變量 33
4.1.2 變量名 34
4.1.3 類型的大小 35
4.1.4 字節與位 35
4.1.5 從1字節到2字節 37
4.2 運算符 37
4.2.1 +、-、++與--運算符 38
4.2.2 +=與-=運算符 39
4.2.3 *、/、%、*=、/=與%=運算符 40
4.3 使用圓括號 41
4.4 運算符優先級 42
4.5 示例程序 43
4.5.1 打開Operator.xcodeproj 43
4.5.2 分析Operator源代碼 44
4.5.3 打開Postfix.xcode 47
4.5.4 分析Postfix源代碼 47
4.6 修剪代碼 49
4.6.1 源代碼間距 49
4.6.2 代碼注釋 51
4.6.3 花括號之爭 52
4.7 接下來的內容 53
第5章 調試 55
5.1 何為調試器 55
5.2 控制執行 56
5.2.1 設置斷點 57
5.2.2 跳過語句 59
5.2.3 單步執行函數 59
5.2.4 跳出函數 62
5.2.5 全速前進 63
5.3 查看變量 64
5.4 調試器怎么像座冰山一樣 66
5.5 接下來的內容 67
第6章 控制程序的流程 68
6.1 流程控制 68
6.2 表達式 69
6.2.1 結果為真的表達式 70
6.2.2 比較運算符 71
6.2.3 邏輯運算符 71
6.2.4 TruthTester.xcodeproj 74
6.3 復合表達式 74
6.4 語句 75
6.4.1 花括號 76
6.4.2 應該將分號放置在何處 77
6.4.3 兩個常見陷阱 78
6.5 while語句 81
6.6 for語句 83
6.7 do語句 87
6.8 switch語句 88
6.8.1 不帶語句的case 90
6.8.2 毀譽參半的穿越 91
6.8.3 switch總結 91
6.9 循環中的break 92
6.10 continue語句 92
6.11 IsOdd.xcodeproj 93
6.12 NextPrime.xcodeproj 95
6.13 接下來的內容 98
第7章 指針與參數 100
7.1 何為指針 100
7.1.1 為何要使用指針 101
7.1.2 圖書館示例小結 102
7.2 指針基礎 103
7.2.1 變量地址 103
7.2.2 &運算符 104
7.2.3 聲明指針變量 104
7.2.4 *運算符 105
7.3 函數參數 109
7.3.1 變量的作用域 109
7.3.2 函數參數的工作原理 110
7.3.3 參數是臨時的 111
7.3.4 實參與形參的區別 112
7.4 函數返回值 113
7.4.1 printf()返回一個值 114
7.4.2 多條return語句 114
7.4.3 什么都不返回 115
7.5 整合 116
7.5.1 將指針作為形參 116
7.5.2 Factor.xcodeproj 117
7.6 關于指針的一些說明 119
7.6.1 按值傳遞與按引用傳遞 119
7.6.2 NULL指針值 119
7.6.3 指針的陰暗面 120
7.7 全局與靜態變量 121
7.7.1 全局變量 121
7.7.2 向程序添加全局變量 123
7.7.3 靜態變量 124
7.7.4 接下來的內容 125
第8章 更多數據類型 127
8.1 int之外的數據類型 127
8.1.1 FloatSizer 128
8.1.2 整型類型 133
8.1.3 IntSizer.xcodeproj 135
8.1.4 int的優缺點 136
8.2 最佳整型類型 139
8.2.1 語義類型 140
8.2.2 精確寬度類型 140
8.2.3 整型與浮點型 141
8.3 使用字符 141
8.3.1 ASCII字符集 142
8.3.2 ASCII.xcodeproj 142
8.3.3 分析ASCII源代碼 145
8.4 數組 146
8.4.1 為何使用數組 147
8.4.2 Dice.xcode 147
8.4.3 分析Dice源代碼 148
8.4.4 要小心 151
8.5 #define指令 151
8.5.1 在代碼中使用#define 153
8.5.2 分析預處理器 154
8.5.3 使用#define指令的好處 155
8.5.4 類似于函數的#define宏 156
8.6 文本字符串 157
8.6.1 內存中的文本字符串 157
8.6.2 FullName.xcodeproj 158
8.6.3 Overflow.xcodeproj 161
8.7 接下來的內容 163
第9章 命令行 165
9.1 命令行基礎 165
9.1.1 命令參數 167
9.1.2 命令進階 168
9.1.3 shell命令來自何處 169
9.2 創建命令行工具 170
9.2.1 命令參數與main() 171
9.2.2 SeeArgs.xcodeproj 171
9.3 部署程序 173
9.4 使用路徑 176
9.4.1 當前目錄與相對路徑 176
9.4.2 特殊目錄名 178
9.4.3 主目錄名 179
9.5 安裝命令行工具 179
9.5.1 創建私有的bin目錄 180
9.5.2 安裝工具 181
9.5.3 配置PATH變量 181
9.6 字符輸入 182
9.6.1 管道 182
9.6.2 重定向 183
9.6.3 Namer.xcodeproj 186
9.7 指針運算 191
9.7.1 指針比較 191
9.7.2 指針加法 191
9.7.3 指針減法 193
9.8 WordCount.xcodeproj 194
9.8.1 分析WordCount源代碼 195
9.8.2 在Shell中測試WordCount 201
9.9 RomanNumeral.xcodeproj 203
9.9.1 main() 204
9.9.2 NumberToRomanNumeral() 204
9.10 關于命令行界面的總結 208
9.11 接下來的內容 209
第10章 設計自定義數據結構 210
10.1 打包數據 210
10.2 模型A:3個數組 210
10.3 模型B:結構化方式 217
10.4 將結構體作為參數傳遞 222
10.5 ParamAddress.xcodeproj 224
10.6 結構體數組 225
10.7 分配自己的內存 226
10.7.1 使用malloc() 227
10.7.2 free() 229
10.7.3 追蹤地址 229
10.8 使用鏈表 230
10.8.1 為何使用鏈表 230
10.8.2 創建鏈表 230
10.9 DVDTracker.xcodeproj 231
10.10 接下來的內容 239
第11章 使用文件 240
11.1 何為數據文件 240
11.2 文件基礎 241
11.2.1 理解文件名 241
11.2.2 打開與關閉文件 242
11.3 讀取文件 243
11.4 PrintFile.xcodeproj 245
11.5 寫入文件 248
11.6 其他文件操縱方法 260
11.6.1 更新模式 260
11.6.2 隨機文件訪問 261
11.6.3 使用隨機訪問函數 261
11.6.4 DinoEdit.xcodeproj 262
11.6.5 文本與數據文件 268
11.6.6 處理端的問題 269
11.7 改進RomanNumeral 270
11.7.1 分析RomanNumeral.xcodeproj 271
11.7.2 測試RomanNumeral 274
11.8 文件系統對象 276
11.9 接下來的內容 277
第12章 錯誤處理 278
12.1 墨菲定律 278
12.2 規則#1:永遠不要假設 279
12.2.1 關于變量的假設 280
12.2.2 檢查范圍 281
12.2.3 容忍所有可能值 282
12.2.4 對假設進行斷言 283
12.3 規則#2:保持警覺 285
12.3.1 關注返回值 285
12.3.2 errno 286
12.4 規則#3:制訂逃生計劃 288
12.4.1 緊跟成功 288
12.4.2 提前返回 290
12.4.3 忽略之前的失敗 291
12.4.4 過濾錯誤 293
12.4.5 盡早退出 294
12.4.6 跳過 295
12.5 規則#4:預測問題 298
12.6 規則#5:適當選取 299
12.7 接下來的內容 300
第13章 高階主題 301
13.1 類型轉換 301
13.1.1 轉換規則 302
13.1.2 轉換警告 304
13.2 強制類型轉換 304
13.3 const修飾符 307
13.4 創建自定義類型 308
13.4.1 struct typedef 309
13.4.2 前向引用 309
13.5 枚舉類型 310
13.6 聯合體 312
13.7 遞歸 314
13.7.1 迭代 315
13.7.2 遞歸 315
13.8 函數指針 318
13.9 其余運算符 319
13.10 深入探索標準庫 321
13.10.1 使用標準庫進行排序 322
13.10.2 Core Foundation中的集合 327
13.11 接下來的內容 333
第14章 未來展望 335
14.1 Mac用戶界面 335
14.1.1 學習Objective-C 336
14.1.2 Cocoa與Cocoa Touch 336
14.2 了解一些OS X代碼 337
14.3 iOS應用速覽 339
14.4 Objective-C速覽 340
14.5 繼續前行 343
附錄 練習答案 344