基本信息
原書名: C Programming: A Modern Approach, 2nd Edition
原出版社: W. W. Norton & Company 作者: (美)K. N. King
譯者: 呂秀鋒 黃倩
叢書名: 圖靈程式設計叢書 C/C++系列
出版社:人民郵電出版社
ISBN:9787115219572
上架時間:2010-3-16
出版日期:2010 年4月
開本:16開
頁碼:600
版次:2-1
內容簡介
本書是為大學本科階段的 c語言課程編寫的教材,同時也非常適合作為其他課程的輔助用書。
時至今日, c語言仍然是計算機領域的通用語言之一,但今天的 c語言已經和最初的時候大不相同了。本書最主要的一個目的就是通過一種“現代方法”來介紹 c語言,書中強調標準 c,強調軟體工程,不再強調“手工最佳化”。這一版中緊密結合了 c99標準,並與 c89標準進行對照,補充了 c99中的最新特性。本書分為 c語言的基礎特性、 c語言的高級特性、 c語言標準庫和參考資料 4個部分。每章末尾都有一個“問與答”小節給出一系列與該章內容相關的問題及答案,此外還包含適量的習題。
作者
K. N. King 世界知名的電腦程式設計教育家,現為喬治亞州立大學數學與計算機科學系副教授。他擁有耶魯大學計算機科學碩士學位,加州大學伯克利分校計算機科學博士學位,曾任教於喬治亞理工學院。除本書外,他還撰寫了廣受歡迎的著作Modula-2: A Complete Guide 和Java Programming: From the Beginning,並在Dr.Dobb's Journal等權威雜誌上發表了許多文章。業餘時間,King教授還在多部電影中扮演過角色。
呂秀鋒 亞洲理工大學( AIT )計算機軟體碩士,現為北京理工大學軟體學院教師。
目錄
第1章 c語言概述 1
1.1 c語言的歷史 1
1.1.1 起源 1
1.1.2 標準化 1
1.1.3 基於c的語言 2
1.2 c語言的優缺點 3
1.2.1 c語言的優點 3
1.2.2 c語言的缺點 3
1.2.3 高效地使用c語言 4
問與答 5
第2章 c語言基本概念 7
2.1 編寫一個簡單的c程式 7
程式 顯示雙關語 7
2.1.1 編譯和連結 8
2.1.2 集成開發環境 8
2.2 簡單程式的一般形式 9
2.2.1 指令 9
2.2.2 函式 9
2.2.3 語句 10
2.2.4 顯示字元串 10
.2.3 注釋 11
2.4 變數和賦值 12
2.4.1 類型 12
2.4.2 聲明 13
2.4.3 賦值 13
2.4.4 顯示變數的值 14
程式 計算箱子的空間重量 14
2.4.5 初始化 15
2.4.6 顯示表達式的值 16
2.5 讀入輸入 16
程式 計算箱子的空間重量(改進版) 16
2.6 定義常量的名字 17
程式 華氏溫度轉換為攝氏溫度 17
2.7 標識符 18
2.8 c程式的書寫規範 19
問與答 21
練習題 23
編程題 24
第3章 格式化輸入/輸出 26
3.1 printf函式 26
3.1.1 轉換說明 27
程式 用printf函式格式化數 28
3.1.2 轉義序列 28
3.2 scanf函式 29
3.2.1 scanf函式的工作方法 30
3.2.2 格式串中的普通字元 31
3.2.3 易混淆的printf函式和scanf
函式 32
程式 分數相加 32
問與答 33
練習題 34
編程題 35
第4章 表達式 36
4.1 算術運算符 36
程式 計算通用產品代碼的校驗位 38
4.2 賦值運算符 39
4.2.1 簡單賦值 40
4.2.2 左值 41
4.2.3 複合賦值 41
4.3 自增運算符和自減運算符 42
4.4 表達式求值 43
4.5 表達式語句 45
問與答 45
練習題 47
編程題 49
第5章 選擇語句 50
5.1 邏輯表達式 50
5.1.1 關係運算符 50
5.1.2 判等運算符 51
5.1.3 邏輯運算符 51
5.2 if語句 52
5.2.1 複合語句 53
5.2.2 else子句 53
5.2.3 級聯式if語句 54
程式 計算股票經紀人的佣金 55
5.2.4 “懸空else”的問題 56
5.2.5 條件表達式 57
5.2.6 c89中的布爾值 58
5.2.7 c99中的布爾值 58
5.3 switch語句 59
程式 顯示法定格式的日期 61
問與答 62
練習題 65
編程題 67
第6章 循環 69
6.1 while語句 69
程式 顯示平方表 71
程式 數列求和 71
6.2 do語句 72
程式 計算整數的位數 73
6.3 for語句 73
6.3.1 for語句的慣用法 74
6.3.2 在for語句中省略表達式 75
6.3.3 c99中的for語句 75
6.3.4 逗號運算符 76
程式 顯示平方表(改進版) 77
6.4 退出循環 78
6.4.1 break語句 78
6.4.2 continue語句 78
6.4.3 goto語句 79
程式 賬簿結算 80
6.5 空語句 81
問與答 83
練習題 84
編程題 85
第7章 基本類型 88
7.1 整數類型 88
7.1.1 c99中的整數類型 90
7.1.2 整數常量 90
7.1.3 c99中的整數常量 91
7.1.4 整數溢出 91
7.1.5 讀/寫整數 91
程式 數列求和(改進版) 92
7.2 浮點類型 93
7.2.1 浮點常量 94
7.2.2 讀/寫浮點數 94
7.3 字元類型 94
7.3.1 字元操作 95
7.3.2 有符號字元和無符號字元 95
7.3.3 算術類型 96
7.3.4 轉義序列 96
7.3.5 字元處理函式 97
7.3.6 用scanf和printf讀/寫字元 98
7.3.7 用getchar和putchar讀/寫
字元 98
程式 確定訊息的長度 99
7.4 類型轉換 100
7.4.1 常用算術轉換 101
7.4.2 賦值過程中的轉換 102
7.4.3 c99中的隱式轉換 103
7.4.4 強制類型轉換 103
7.5 類型定義 105
7.5.1 類型定義的優點 105
7.5.2 類型定義和可移植性 105
7.6 sizeof運算符 106
問與答 107
練習題 109
編程題 110
第8章 數組 113
8.1 一維數組 113
8.1.1 數組下標 113
程式 數列反向 115
8.1.2 數組初始化 115
8.1.3 指定初始化式 116
程式 檢查數中重複出現的數字 116
8.1.4 對數組使用sizeof運算符 117
程式 計算利息 118
8.2 多維數組 119
8.2.1 多維數組初始化 120
8.2.2 常量數組 121
程式 發牌 121
8.3 c99中的變長數組 122
問與答 123
練習題 124
編程題 125
第9章 函式 129
9.1 函式的定義和調用 129
程式 計算平均值 129
程式 顯示倒計數 130
程式 顯示雙關語(改進版) 131
9.1.1 函式定義 132
9.1.2 函式調用 133
程式 判定素數 134
9.2 函式聲明 135
9.3 實際參數 136
9.3.1 實際參數的轉換 137
9.3.2 數組型實際參數 138
9.3.3 變長數組形式參數 140
9.3.4 在數組參數聲明中使用
static 141
9.3.5 複合字面量 141
9.4 return語句 142
9.5 程式終止 143
9.6 遞歸 144
程式 快速排序 146
問與答 147
練習題 150
編程題 153
第10章 程式結構 155
10.1 局部變數 155
10.1.1 靜態局部變數 156
10.1.2 形式參數 156
10.2 外部變數 156
10.2.1 示例:用外部變數實現棧 156
10.2.2 外部變數的利與弊 157
程式 猜數 158
10.3 程式塊 161
10.4 作用域 162
10.5 構建c程式 163
程式 給一手牌分類 163
問與答 169
練習題 169
編程題 170
第11章 指針 172
11.1 指針變數 172
11.2 取地址運算符和間接定址運算符 173
11.2.1 取地址運算符 173
11.2.2 間接定址運算符 174
11.3 指針賦值 174
11.4 指針作為參數 176
程式 找出數組中的最大元素和最
小元素 177
11.5 指針作為返回值 179
問與答 180
練習題 181
編程題 182
第12章 指針和數組 184
12.1 指針的算術運算 184
12.1.1 指針加上整數 185
12.1.2 指針減去整數 185
12.1.3 兩個指針相減 186
12.1.4 指針比較 186
12.1.5 指向複合常量的指針 186
12.2 指針用於數組處理 186
12.3 用數組名作為指針 188
程式 數列反向(改進版) 189
12.3.1 數組型實際參數(改進版) 189
12.3.2 用指針作為數組名 191
12.4 指針和多維數組 191
12.4.1 處理多維數組的元素 191
12.4.2 處理多維數組的行 192
12.4.3 處理多維數組的列 192
12.4.4 用多維數組名作為指針 192
12.5 c99中的指針和變長數組 193
問與答 194
練習題 195
編程題 197
第13章 字元串 198
13.1 字元串字面量 198
13.1.1 字元串字面量中的轉義序列 198
13.1.2 延續字元串字面量 199
13.1.3 如何存儲字元串字面量 199
13.1.4 字元串字面量的操作 200
13.1.5 字元串字面量與字元常量 200
13.2 字元串變數 200
13.2.1 初始化字元串變數 201
13.2.2 字元數組與字元指針 202
13.3 字元串的讀和寫 203
13.3.1 用printf函式和puts函式
寫字元串 203
13.3.2 用scanf函式和gets函式讀
字元串 203
13.3.3 逐個字元讀字元串 204
13.4 訪問字元串中的字元 205
13.5 使用c語言的字元串庫 206
13.5.1 strcpy函式 207
13.5.2 strlen函式 208
13.5.3 strcat函式 208
13.5.4 strcmp函式 209
程式 顯示一個月的提醒列表 209
13.6 字元串慣用法 211
13.6.1 搜尋字元串的結尾 211
13.6.2 複製字元串 213
13.7 字元串數組 214
程式 核對行星的名字 217
問與答 218
練習題 220
編程題 222
第14章 預處理器 225
14.1 預處理器的工作原理 225
14.2 預處理指令 227
14.3 宏定義 227
14.3.1 簡單的宏 227
14.3.2 帶參數的宏 229
14.3.3 #運算符 231
14.3.4 ##運算符 231
14.3.5 宏的通用屬性 232
14.3.6 宏定義中的圓括弧 233
14.3.7 創建較長的宏 233
14.3.8 預定義宏 234
14.3.9 c99中新增的預定義宏 235
14.3.10 空的宏參數 236
14.3.11 參數個數可變的宏 236
14.3.12 __func__標識符 237
14.4 條件編譯 237
14.4.1 #if指令和#endif指令 238
14.4.2 defined運算符 238
14.4.3 #ifdef指令和#ifndef
指令 239
14.4.4 #elif指令和#else指令 239
14.4.5 使用條件編譯 240
14.5 其他指令 240
14.5.1 #error指令 240
14.5.2 #line指令 241
14.5.3 #pragma指令 242
14.5.4 _pragma運算符 242
問與答 243
練習題 245
第15章 編寫大型程式 248
15.1 源檔案 248
15.2 頭檔案 249
15.2.1 #include指令 249
15.2.2 共享宏定義和類型定義 250
15.2.3 共享函式原型 251
15.2.4 共享變數聲明 252
15.2.5 嵌套包含 253
15.2.6 保護頭檔案 253
15.2.7 頭檔案中的#error指令 254
15.3 把程式劃分成多個檔案 254
程式 文本格式化 255
15.4 構建多檔案程式 260
15.4.1 makefile 260
15.4.2 連結期間的錯誤 262
15.4.3 重新構建程式 262
15.4.4 在程式外定義宏 264
問與答 264
練習題 265
編程題 266
第16章 結構、聯合和枚舉 267
16.1 結構變數 267
16.1.1 結構變數的聲明 267
16.1.2 結構變數的初始化 269
16.1.3 指定初始化 269
16.1.4 對結構的操作 270
16.2 結構類型 270
16.2.1 結構標記的聲明 271
16.2.2 結構類型的定義 272
16.2.3 結構作為參數和返回值 272
16.2.4 複合字面量 273
16.3 嵌套的數組和結構 274
16.3.1 嵌套的結構 274
16.3.2 結構數組 274
16.3.3 結構數組的初始化 275
程式 維護零件資料庫 275
16.4 聯合 281
16.4.1 用聯合來節省空間 282
16.4.2 用聯合來構造混合的數據
結構 284
16.4.3 為聯合添加“標記欄位” 284
16.5 枚舉 285
16.5.1 枚舉標記和類型名 286
16.5.2 枚舉作為整數 286
16.5.3 用枚舉聲明“標記欄位” 286
問與答 287
練習題 289
編程題 293
第17章 指針的高級套用 294
17.1 動態存儲分配 294
17.1.1 記憶體分配函式 294
17.1.2 空指針 295
17.2 動態分配字元串 296
17.2.1 使用malloc函式為字元串
分配記憶體 296
17.2.2 在字元串函式中使用動態
存儲分配 296
17.2.3 動態分配字元串的數組 297
程式 顯示一個月的提醒列表
(改進版) 297
17.3 動態分配數組 299
17.3.1 使用malloc函式為數組分配
存儲空間 299
17.3.2 calloc函式 300
17.3.3 realloc函式 300
17.4 釋放存儲空間 301
17.4.1 free函式 301
17.4.2 “懸空指針”問題 301
17.5 鍊表 302
17.5.1 聲明結點類型 302
17.5.2 創建結點 303
17.5.3 -)運算符 303
17.5.4 在鍊表的開始處插入結點 304
17.5.5 搜尋鍊表 306
17.5.6 從鍊表中刪除結點 307
17.5.7 有序鍊表 308
程式 維護零件資料庫(改進版) 309
17.6 指向指針的指針 313
17.7 指向函式的指針 314
17.7.1 函式指針作為參數 314
17.7.2 qsort函式 314
17.7.3 函式指針的其他用途 316
程式 列三角函式表 317
17.8 受限指針 318
17.9 靈活數組成員 319
問與答 320
練習題 323
編程題 325
第18章 聲明 327
18.1 聲明的語法 327
18.2 存儲類型 328
18.2.1 變數的性質 328
18.2.2 auto存儲類型 329
18.2.3 static存儲類型 329
18.2.4 extern存儲類型 330
18.2.5 register存儲類型 331
18.2.6 函式的存儲類型 332
18.2.7 小結 332
18.3 類型限定符 333
18.4 聲明符 334
18.4.1 解釋複雜聲明 335
18.4.2 使用類型定義來簡化聲明 336
18.5 初始化式 336
18.6 內聯函式 337
18.6.1 內聯定義 338
18.6.2 對內聯函式的限制 339
18.6.3 在gcc中使用內聯函式 339
問與答 339
練習題 342
第19章 程式設計 345
19.1 模組 345
19.1.1 內聚性與耦合性 347
19.1.2 模組的類型 347
19.2 信息隱藏 347
19.3 抽象數據類型 350
19.3.1 封裝 351
19.3.2 不完整類型 351
19.4 棧抽象數據類型 352
19.4.1 為棧抽象數據類型定義接口 352
19.4.2 用定長數組實現棧抽象數據
類型 353
19.4.3 改變棧抽象數據類型中數據
項的類型 354
19.4.4 用動態數組實現棧抽象數據
類型 355
19.4.5 用鍊表實現棧抽象數據類型 357
19.5 抽象數據類型的設計問題 359
19.5.1 命名慣例 359
19.5.2 錯誤處理 359
19.5.3 通用抽象數據類型 359
19.5.4 新語言中的抽象數據類型 360
問與答 360
練習題 361
編程題 362
第20章 底層程式設計 363
20.1 位運算符 363
20.1.1 移位運算符 363
20.1.2 按位求反運算符、按位與運
算符、按位異或運算符和按
位或運算符 364
20.1.3 用位運算符訪問位 365
20.1.4 用位運算符訪問位域 366
程式 xor加密 366
20.2 結構中的位域 367
20.3 其他底層技術 369
20.3.1 定義依賴機器的類型 369
20.3.2 用聯合提供數據的多個視角 370
20.3.3 將指針作為地址使用 371
程式 查看記憶體單元 371
20.3.4 volatile類型限定符 373
問與答 374
練習題 374
編程題 376
第21章 標準庫 377
21.1 標準庫的使用 377
21.1.1 對標準庫中所用名字的
限制 377
21.1.2 使用宏隱藏的函式 378
21.2 c89標準庫概述 378
21.3 c99標準庫更新 380
21.4 (stddef.h):常用定義 381
21.5 (stdbool.h):布爾類型和值 381
問與答 382
練習題 382
編程題 383
第22章 輸入/輸出 384
22.1 流 384
22.1.1 檔案指針 385
22.1.2 標準流和重定向 385
22.1.3 文本檔案與二進制檔案 385
22.2 檔案操作 386
22.2.1 打開檔案 386
22.2.2 模式 387
22.2.3 關閉檔案 388
22.2.4 為打開的流附加檔案 389
22.2.5 從命令行獲取檔案名稱 389
程式 檢查檔案是否可以打開 389
22.2.6 臨時檔案 390
22.2.7 檔案緩衝 391
22.2.8 其他檔案操作 392
22.3 格式化的輸入/輸出 393
22.3.1 …printf函式 393
22.3.2 …printf轉換說明 393
22.3.3 c99對…printf轉換說明的
修改 395
22.3.4 …printf轉換說明示例 396
22.3.5 …scanf函式 398
22.3.6 …scanf格式串 398
22.3.7 …scanf轉換說明 398
22.3.8 c99對...scanf轉換說明的
改變 400
22.3.9 scanf示例 400
22.3.10 檢測檔案末尾和錯誤條件 401
22.4 字元的輸入/輸出 403
22.4.1 輸出函式 403
22.4.2 輸入函式 403
程式 複製檔案 404
22.5 行的輸入/輸出 405
22.5.1 輸出函式 405
22.5.2 輸入函式 406
22.6 塊的輸入/輸出 406
22.7 檔案定位 407
程式 修改零件記錄檔案 409
22.8 字元串的輸入/輸出 409
22.8.1 輸出函式 410
22.8.2 輸入函式 410
問與答 411
練習題 414
編程題 416
第23章 庫對數值和字元數據的支持 419
23.1 (float.h):浮點類型的特性 419
23.2 (limits.h):整數類型的大小 421
23.3 (math.h):數學計算(c89) 422
23.3.1 錯誤 422
23.3.2 三角函式 422
23.3.3 雙曲函式 423
23.3.4 指數函式和對數函式 423
23.3.5 冪函式 424
23.3.6 就近取整函式、絕對值函式
和取余函式 424
23.4 (math.h):數學計算(c99) 425
23.4.1 ieee浮點標準 425
23.4.2 類型 426
23.4.3 宏 426
23.4.4 錯誤 426
23.4.5 函式 427
23.4.6 分類宏 427
23.4.7 三角函式 428
23.4.8 雙曲函式 428
23.4.9 指數函式和對數函式 429
23.4.10 冪函式和絕對值函式 430
23.4.11 誤差函式和伽瑪函式 430
23.4.12 就近取整函式 431
23.4.13 取余函式 432
23.4.14 操作函式 432
23.4.15 最大值函式、最小值函式
和正差函式 433
23.4.16 浮點乘加 433
23.4.17 比較宏 434
23.5 (ctype.h):字元處理 434
23.5.1 字元分類函式 435
程式 測試字元分類函式 436
23.5.2 字元大小寫映射函式 437
程式 測試大小寫映射函式 437
23.6 (string.h):字元串處理 437
23.6.1 複製函式 437
23.6.2 拼接函式 438
23.6.3 比較函式 439
23.6.4 搜尋函式 440
23.6.5 其他函式 442
問與答 442
練習題 443
編程題 444
第24章 錯誤處理 446
24.1 (assert.h):診斷 446
24.2 (errno.h):錯誤 447
24.3 (signal.h):信號處理 448
24.3.1 信號宏 449
24.3.2 signal函式 449
24.3.3 預定義的信號處理函式 450
24.3.4 raise函式 450
程式 測試信號 451
24.4 (setjmp.h):非局部跳轉 452
程式 測試setjmp和longjmp 452
問與答 453
練習題 454
第25章 國際化特性 456
25.1 (locale.h):本地化 456
25.1.1 類別 456
25.1.2 setlocale函式 457
25.1.3 localeconv函式 458
25.2 多位元組字元和寬字元 461
25.2.1 多位元組字元 461
25.2.2 寬字元 461
25.2.3 統一碼和通用字元集 462
25.2.4 統一碼編碼 462
25.2.5 多位元組/寬字元轉換函式 463
25.2.6 多位元組/寬字元串轉換函式 465
25.3 雙字元和三字元 465
25.3.1 三字元 465
25.3.2 雙字元 466
25.3.3 (iso646.h):拼寫替換 467
25.4 通用字元名 467
25.5 (wchar.h):擴展的多位元組和寬字元
實用工具 467
25.5.1 流傾向 468
25.5.2 格式化寬字元輸入/輸出
函式 468
25.5.3 寬字元輸入/輸出函式 470
25.5.4 通用的寬字元串實用工具 471
25.5.5 寬字元時間轉換函式 474
25.5.6 擴展的多位元組/寬字元轉換
實用工具 474
25.6 (wctype.h):寬字元分類和映射實
用工具 477
25.6.1 寬字元分類函式 477
25.6.2 可擴展的寬字元分類函式 478
25.6.3 寬字元大小寫映射函式 478
25.6.4 可擴展的寬字元大小寫映射
函式 478
問與答 479
練習題 479
編程題 480
第26章 其他庫函式 482
26.1 (stdarg.h):可變參數 482
26.1.1 調用帶有可變參數列表的
函式 483
26.1.2 v…printf函式 484
26.1.3 v…scanf函式 485
26.2 (stdlib.h):通用的實用工具 485
26.2.1 數值轉換函式 485
程式 測試數值轉換函式 486
26.2.2 偽隨機序列生成函式 488
程式 測試偽隨機序列生成函式 488
26.2.3 與環境的通信 489
26.2.4 搜尋和排序實用工具 490
程式 確定航空里程 491
26.2.5 整數算術運算函式 492
26.3 (time.h):日期和時間 492
26.3.1 時間處理函式 493
26.3.2 時間轉換函式 495
程式 顯示日期和時間 498
問與答 500
練習題 501
編程題 502
第27章 c99對數學計算的新增支持 503
27.1 (stdint.h):整數類型 503
27.1.1 (stdint.h)類型 503
27.1.2 對指定寬度整數類型的限制 504
27.1.3 對其他整數類型的限制 505
27.1.4 用於整數常量的宏 505
27.2 (inttypes.h):整數類型的格式
轉換 506
27.2.1 用於格式說明符的宏 506
27.2.2 用於最大寬度整數類型的
函式 507
27.3 複數 508
27.3.1 複數的定義 508
27.3.2 複數的算術運算 509
27.3.3 c99中的複數類型 509
27.3.4 複數的運算 510
27.3.5 複數類型的轉換規則 510
27.4 (complex.h):複數算術運算 511
27.4.1 (complex.h)宏 511
27.4.2 cx_limited_range編譯
提示 512
27.4.3 (complex.h)函式 512
27.4.4 三角函式 512
27.4.5 雙曲函式 513
27.4.6 指數函式和對數函式 514
27.4.7 冪函式和絕對值函式 514
27.4.8 操作函式 514
程式 求二次方程的根 515
27.5 (tgmath.h):泛型數學 515
27.5.1 泛型宏 516
27.5.2 調用泛型宏 517
27.6 (fenv.h):浮點環境 518
27.6.1 浮點狀態標誌和控制模式 518
27.6.2 (fenv.h)宏 519
27.6.3 fenv_access編譯提示 519
27.6.4 浮點異常函式 520
27.6.5 捨入函式 520
27.6.6 環境函式 521
問與答 521
練習題 522
編程題 523
附錄a c語言運算符 524
附錄b c99與c89的比較 525
附錄c c89與經典c的比較 529
附錄d 標準庫函式 532
附錄e ascii字元集 569
參考文獻 570
索引 573