C語言程序設計 現代方法 第2版·修訂版 C Programming: A Modern Approach, 2/e

[美]K.N.金(K.N.King) 呂秀鋒,黃倩譯

  • C語言程序設計 現代方法 第2版·修訂版-preview-1
  • C語言程序設計 現代方法 第2版·修訂版-preview-2
C語言程序設計 現代方法 第2版·修訂版-preview-1

買這商品的人也買了...

相關主題

商品描述

時至今日,C語言仍然是計算機領域的通用語言之一,
但今天的C語言已經和最初的時候大不相同了。
本書主要目的就是通過一種“現代方法”來介紹C語言,
書中強調標準C,強調軟件工程,不再強調“手工優化”。
第2版修訂版中不僅有C99中的新特性,
還與時俱進地增加了C11和C18中的內容。
本書分為C語言的基礎特性、C語言的高級特性、
C語言標準庫和參考資料4個部分。
每章末尾的“問與答”部分給出一系列與該章內容相關的問題及答案,
此外還包含適量的習題。
本書是C開發人員的理想參考書,
在國外也被眾多大學作為C語言課程的教材。

作者簡介

KN金(KN King)
世界知名的計算機程序設計教育家。
他擁有耶魯大學計算機科學碩士學位,
加州大學伯克利分校計算機科學博士學位,
曾任教於佐治亞理工學院和佐治亞州立大學。
除本書外,他還撰寫了廣受歡迎的著作Modula-2: A Complete Guide和Java Programming: From the Beginning。


【譯者簡介】
呂秀鋒
曾任教於北京理工大學軟件學院,講授過多門計算機課程,
包括“計算機基礎(雙語)”“C語言程序設計(雙語)
”“數據結構”“程序設計開發與實踐”。

黃倩
河海大學計算機科學與技術系主任,
兼任中國人工智能學會深度學習專委會委員、
中國計算機學會多媒體技術專委會委員。
博士畢業於中國科學院計算技術研究所,譯有《編程珠璣(第2版)》等。


【審校簡介】
李忠
資深C語言專家。著有《穿越計算機的迷霧》
《X86彙編語言:從實模式到保護模式》
《C語言非常道》和《標準C語言指南》等。

目錄大綱

第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語言的缺點4
1.2.3高效地使用C語言5
問與答5

第2章C語言基本概念7
2.1編寫一個簡單的C程序7
2.1.1編譯和鏈接8
2.1.2集成開發環境9
2.2簡單程序的一般形式9
2.2.1指令9
2.2.2函數9
2.2.3語句10
2 .2.4顯示字符串11
2.3註釋11
2.4變量和賦值13
2.4.1類型13
2.4.2聲明13
2.4.3賦值14
2.4.4顯示變量的值15
2.4.5初始化16
2.4.6顯示表達式的值17
2.5讀入輸入17
2.6定義常量的名字18
2.7標識符19
2.8 C程序的書寫規範21
問與答23
練習題25
編程題26

第3章格式化輸入/輸出28
3.1 printf函數28
3.1.1轉換說明29
3.1.2轉義序列31
3.2 scanf函數31
3. 2.1 scanf函數的工作方法32
3.2.2格式串中的普通字符34
3.2.3易混淆的printf函數和scanf函數34
問與答35
練習題37
編程題38

第4章表達式40
4.1算術運算符40
4.2賦值運算符44
4.2.1簡單賦值44
4.2.2左值45
4.2.3複合賦值45
4.3自增運算符和自減運算符46
4.4表達式求值47
4.5表達式語句50
問與答50
練習題52
編程題54

第5章選擇語句56
5.1邏輯表達式56
5.1.1關係運算符56
5 .1.2判等運算符57
5.1.3邏輯運算符57
5.2 if語句58
5.2.1複合語句59
5.2.2 else子句59
5.2.3級聯式if語句61
5.2.4 “懸空else”的問題63
5.2. 5條件表達式63
5.2.6 C89中的布爾值64
5.2.7 C99中的布爾值65
5.3 switch語句66
問與答69
練習題72
編程題74

第6章循環77
6. 1 while語句77
6.2 do語句80
6.3 for語句82
6.3.1 for語句的慣用法83
6.3.2在for語句中省略表達式83
6.3.3 C99中的for語句84
6.3.4逗號運算符84
6.4退出循環86
6.4.1 break語句87
6.4.2 continue語句87
6.4.3 goto語句88
6.5空語句90
問與答92
練習題94
編程題95

第7章基本類型97
7.1整數類型97
7.1.1 C99中的整數類型99
7.1.2整型常量99
7.1.3 C99中的整型常量100
7.1.4整數溢出100
7.1.5讀/寫整數101
7.2浮點類型102
7.2.1浮點常量103
7.2.2讀/寫浮點數103
7.3字符類型104
7.3.1字符操作104
7.3.2有符號字符和無符號字符105
7.3.3算術類型105
7.3.4轉義序列106
7.3.5字符處理函數107
7.3.6用scanf和printf讀/寫字符108
7.3.7用getchar和putchar讀/寫字符108
7.4類型轉換110
7.4.1常規算術轉換111
7.4.2賦值過程中的轉換112
7.4.3 C99中的隱式轉換113
7.4. 4強制類型轉換114
7.5類型定義115
7.5.1類型定義的優點115
7.5.2類型定義和可移植性116
7.6 sizeof運算符117
問與答117
練習題120
編程題121

第8章數組124
8.1一維數組124
8.1.1數組下標124
8.1.2數組初始化126
8.1.3指示器127
8.1.4對數組使用sizeof運算符129
8 .2多維數組130
8.2.1多維數組初始化131
8.2.2常量數組132
8.3 C99中的變長數組134
問與答135
練習題136
編程題138

第9章函數141
9.1函數的定義和調用141
9.1.1函數定義144
9.1.2函數調用145
9.2函數聲明147
9.3實際參數149
9.3.1實際參數的轉換150
9.3.2數組型實際參數151
9.3.3變長數組形式參數153
9.3.4在數組參數聲明中使用static 154
9.3.5複合字面量155
9.4 return語句155
9.5程序終止156
9 .6遞歸157
9.7泛型選擇161
問與答163
練習題166
編程題169

第10章程序結構171
10.1局部變量171
10.1.1靜態局部變量172
10.1.2形式參數172
10.2外部變量172
10.2.1示例:用外部變量實現棧172
10.2.2外部變量的利與弊173
10.3程序塊177
10.4作用域178
10.5構建C程序179
問與答185
練習題185
編程題186

第11章指針188
11.1指針變量188
11.2取地址運算符和間接尋址運算符189
11.2.1取地址運算符189
11.2.2間接尋址運算符190
11.3指針賦值191
11.4指針作為參數192
11.5指針作為返回值195
問與答196
練習題198
編程題199

第12章指針和數組201
12.1指針的算術運算201
12.1.1指針加上整數202
12.1.2指針減去整數202
12.1.3兩個指針相減203
12.1.4指針比較203
12.1.5指向複合字面量的指針203
12.2指針用於數組處理204
12.3用數組名作為指針206
12.3.1數組型實際參數(改進版) 207
12.3.2用指針作為數組名208
12.4指針和多維數組209
12.4.1處理多維數組的元素209
12.4.2處理多維數組的行210
12.4.3處理多維數組的列210
12.4.4用多維數組名作為指針210
12.5 C99中的指針和變長數組211
問與答212
練習題213
編程題215

第13章字符串217
13.1字面串217
13.1.1字面串中的轉義序列217
13.1.2延續字面串218
13.1.3如何存儲字面串218
13.1.4字面串的操作219
13.1.5字面串與字符常量219
13.2字符串變量220
13.2.1初始化字符串變量220
13.2.2字符數組與字符指針221
13.3字符串的讀和寫222
13.3.1用printf函數和puts函數寫字符串222
13.3.2用scanf函數讀字符串223
13.3.3逐個字符讀字符串224
13.4訪問字符串中的字符225
13. 5使用C語言的字符串庫226
13.5.1 strcpy函數226
13.5.2 strlen函數227
13.5.3 strcat函數228
13.5.4 strcmp函數229
13.6字符串慣用法231
13 .6.1搜索字符串的結尾232
13.6.2複製字符串233
13.7字符串數組235
問與答238
練習題241
編程題243

第14章預處理器246
14.1預處理器的工作原理246
14.2預處理指令248
14.3宏定義248
14.3.1簡單的宏249
14.3.2帶參數的宏250
14.3.3 #運算符252
14.3.4 # #運算符253
14.3.5宏的通用屬性254
14.3.6宏定義中的圓括號254
14.3.7創建較長的宏255
14.3.8預定義宏256
14.3.9 C99中新增的預定義宏257
14.3.10空的宏參數258
14.3.11參數個數可變的宏259
14.3. 12 __func__標識符260
14.4條件編譯260
14.4.1 #if指令和#endif指令260
14.4.2 defined運算符261
14.4.3 #ifdef指令和#ifndef指令261
14.4 .4 #elif指令和#else指令262
14.4.5使用條件編譯262
14.5其他指令263
14.5.1 #error指令263
14.5.2 #line指令264
14.5.3 #pragma指令265
14.5.4 _Pragma運算符265
問與答266
練習題268

第15章編寫大型程序272
15.1源文件272
15.2頭文件273
15.2.1 #include指令273
15.2. 2共享宏定義和類型定義274
15.2.3共享函數原型275
15.2.4共享變量聲明277
15.2.5嵌套包含278
15.2.6保護頭文件278
15.2.7頭文件中的#error指令279
15.3把程序劃分成多個文件279
15.4構建多文件程序285
15.4.1 makefile 285
15. 4.2鏈接期間的錯誤287
15.4.3重新構建程序287
15.4.4在程序外定義宏289
問與答289
練習題291
編程題292

第16章結構、聯合和枚舉293
16. 1結構變量293
16.1.1結構變量的聲明293
16.1.2結構變量的初始化295
16.1.3指示器295
16.1.4對結構的操作296
16.2結構類型296
16. 2.1結構標記的聲明297
16.2.2結構類型的定義298
16.2.3結構作為參數和返回值298
16.2.4複合字面量299
16.2.5匿名結構300
16.3嵌套的數組和結構301
16.3.1嵌套的結構301
16.3.2結構數組302
16.3.3結構數組的初始化302
16.4聯合309
16.4.1用聯合來節省空間310
16.4.2用聯合來構造混合的數據結構312
16.4.3為聯合添加“標記字段” 312
16.4.4匿名聯合313
16.5枚舉314
16.5.1枚舉標記和類型名315
16.5.2枚舉作為整數315
16.5.3用枚舉聲明“標記字段” 316
問與答316
練習題318
編程題323

第17章指針的高級應用324
17.1動態存儲分配324
17.1.1內存分配函數325
17.1.2空指針325
17.2動態分配字符串326
17.2.1使用malloc函數為字符串分配內存326
17.2.2在字符串函數中使用動態存儲分配327
17.2.3動態分配字符串的數組327
17.3動態分配數組329
17.3.1使用malloc函數為數組分配存儲空間329
17.3.2 calloc函數330
17.3.3 realloc函數330
17.4釋放存儲空間331
17.4.1 free函數332
17.4.2 “懸空指針”問題332
17.5鍊錶332
17.5.1聲明結點類型333
17.5.2創建結點333
17.5.3 ->運算符334
17.5.4在鍊錶的開始處插入結點335
17.5.5搜索鍊錶337
17.5.6從鍊錶中刪除結點338
17.5.7有序鍊錶339
17.6指向指針的指針344
17.7指向函數的指針345
17.7.1函數指針作為參數345
17.7.2 qsort函數346
17.7.3函數指針的其他用途347
17.8受限指針350
17.9彈性數組成員351
問與答352
練習題355
編程題358

第18章聲明359
18.1聲明的語法359
18.2存儲類型360
18.2.1變量的性質361
18.2.2 auto存儲類型361
18.2.3 static存儲類型362
18.2.4 extern存儲類型363
18.2.5 register存儲類型363
18.2.6函數的存儲類型364
18.2.7小結365
18.3類型限定符366
18.4聲明符366
18.4.1解釋複雜聲明368
18.4.2使用類型定義來簡化聲明369
18.5初始化器369
18.6內聯函數371
18.6.1內聯定義371
18.6.2對內聯函數的限制372
18.6.3在GCC中使用內聯函數372
18. 7函數指定符_Noreturn和頭 373
18.8靜態斷言373
問與答374
練習題377

第19章程序設計379
19.1模塊379
19.1.1內聚性與耦合性381
19.1.2模塊的類型381
19.2信息隱藏381
19.3抽像數據類型385
19.3.1封裝385
19.3.2不完整類型386
19.4棧抽像數據類型386
19.4.1為棧抽像數據類型定義接口386
19.4. 2用定長數組實現棧抽像數據類型388
19.4.3改變棧抽像數據類型中數據項的類型389
19.4.4用動態數組實現棧抽像數據類型390
19.4.5用鍊錶實現棧抽像數據類型392
19.5抽像數據類型的設計問題394
19.5.1命名慣例394
19.5.2錯誤處理394
19.5.3通用抽像數據類型394
19.5.4新語言中的抽象數據類型395
問與答395
練習題396
編程題397

第20章底層程序設計398
20.1位運算符398
20.1.1移位運算符398
20.1.2按位取反運算符、按位與運算符、按位異或運算符和按位或運算符399
20.1.3用位運算符訪問位400
20.1.4用位運算符訪問位域401
20.2結構中的位域403
20.3其他底層技術405
20.3.1定義依賴機器的類型405
20.3.2用聯合來提供數據的多個視角405
20.3.3將指針作為地址使用407
20.3.4 volatile類型限定符409
20.4對象的對齊410
20.4.1對齊運算符_Alignof 410
20.4 .2對齊指定符_Alignas和頭 410
問與答411
練習題411
編程題413

第21章標準庫414
21.1標準庫的使用414
21.1.1對標準庫中所用名字的限制415
21.1.2使用宏隱藏的函數415
21.2 C89標準庫概述416
21.3 C99標準庫更新417
21.4:常用定義418
21.5:布爾類型和值419
21.6 C11標準庫更新419
21.7:地址的對齊420
21.8:宏noreturn的定義420
問與答420
練習題421
編程題422

第22章輸入/輸出423
22.1流423
22.1.1文件指針424
22.1.2標準流和重定向424
22.1 .3文本文件與二進製文件425
22.2文件操作426
22.2.1打開文件426
22.2.2模式427
22.2.3關閉文件428
22.2.4為打開的流附加文件428
22 .2.5從命令行獲取文件名429
22.2.6臨時文件430
22.2.7文件緩衝431
22.2.8其他文件操作432
22.3格式化的輸入/輸出433
22.3. 1 …printf函數433
22.3.2 …printf轉換說明433
22.3.3 C99對…printf轉換說明的修改435
22.3.4 …printf轉換說明示例436
22.3.5 …scanf函數438
22 .3.6 …scanf格式串438
22.3.7 …scanf轉換說明439
22.3.8 C99對…scanf轉換說明的改變441
22.3.9 scanf示例441
22.3.10檢測文件末尾和錯誤條件442
22.4字符的輸入/輸出444
22.4.1輸出函數444
22.4.2輸入函數444
22.5行的輸入/輸出446
22.5.1輸出函數446
22.5.2輸入函數447
22.6塊的輸入/輸出447
22.7文件定位448
22 .8字符串的輸入/輸出451
22.8.1輸出函數451
22.8.2輸入函數452
問與答452
練習題455
編程題458

第23章庫對數值和字符數據的支持462
23.1:浮點類型的特性462
23.2:整數類型的大小464
23.3:數學計算(C89) 465
23.3.1錯誤465
23.3.2三角函數466
23.3.3雙曲函數466
23.3.4指數函數和對數函數467
23.3.5冪函數467
23.3.6就近舍入函數、絕對值函數和取餘函數468
23.4:數學計算468
23.4.1 IEEE浮點標準469
23.4.2類型470
23.4.3宏470
23.4.4錯誤470
23.4.5函數471
23.4.6分類宏471
23.4.7三角函數472
23.4.8雙曲函數472
23.4.9指數函數和對數函數473
23.4.10冪函數和絕對值函數474
23.4.11誤差函數和伽馬函數474
23.4.12就近舍入函數475
23.4.13取餘函數476
23.4.14操作函數477
23.4.15最大值函數、最小值函數和正差函數477
23.4. 16浮點乘加478
23.4.17比較宏478
23.5:字符處理479
23.5.1字符分類函數479
23.5.2字符大小寫映射函數481
23.6:字符串處理482
23.6.1複製函數482
23.6.2拼接函數483
23.6.3比較函數484
23.6.4搜索函數485
23.6.5其他函數487
問與答488
練習題488
編程題490

第24章錯誤處理491
24.1:診斷491
24.2:錯誤492
24.3:信號處理494
24.3.1信號宏494
24.3.2 signal函數494
24.3.3預定義的信號處理函數495
24.3.4 raise函數496
24.4:非局部跳轉497
問與答499
練習題500

第25章國際化特性502
25.1:本地化502
25.1.1類項503
25.1.2 setlocale函數503
25.1.3 localeconv函數504
25.2多字節字符和寬字符507
25.2.1多字節字符507
25 .2.2寬字符508
25.2.3 Unicode和通用字符集508
25.2.4 Unicode編碼509
25.2.5多字節/寬字符轉換函數510
25.2.6多字節/寬字符串轉換函數511
25.3雙聯符和三聯符512
25.3.1三聯符512
25.3.2雙聯符513
25.3.3:拼寫替換513
25.4通用字符名514
25.5:擴展的多字節和寬字符實用工具514
25.5.1流的傾向性515
25.5.2格式化寬字符輸入/輸出函數515
25.5.3寬字符輸入/輸出函數517
25. 5.4通用的寬字符串實用工具518
25.5.5寬字符時間轉換函數521
25.5.6擴展的多字節/寬字符轉換實用工具521
25.6:寬字符分類和映射實用工具523
25.6.1寬字符分類函數524
25.6.2可擴展的寬字符分類函數525
25.6.3寬字符大小寫映射函數525
25.6.4可擴展的寬字符大小寫映射函數525
25.7:改進的Unicode支持526
25.7.1帶u、U和u8前綴的字面串526
25.7.2可重啟動的多字節/寬字符轉換函數527
問與答528
練習題529
編程題530

第26章其他庫函數531
26.1:可變參數531
26.1.1調用帶有可變參數列表的函數533
26.1.2 v…printf函數533
26.1.3 v…scanf函數534
26.2:通用的實用工具534
26.2.1數值轉換函數535
26.2.2偽隨機序列生成函數537
26.2.3與環境的通信539
26.2.4搜索和排序實用工具540
26.2 .5整數算術運算函數542
26.2.6地址對齊的內存分配542
26.3:日期和時間542
26.3.1時間處理函數543
26.3.2時間轉換函數545
問與答550
練習題552
編程題553

第27章C99對數學計算的新增支持554
27.1:整數類型554
27.1.1類型555
27.1.2對指定寬度整數類型的限制555
27.1.3對其他整數類型的限制556
27.1.4用於整型常量的宏557
27.2:整數類型的格式轉換557
27.2.1用於格式指定符的宏557
27.2.2用於最大寬度整數類型的函數558
27.3複數559
27.3.1複數的定義559
27. 3.2複數的算術運算560
27.3.3 C99中的複數類型561
27.3.4複數的運算561
27.3.5複數類型的轉換規則562
27.4:複數算術運算562
27.4.1宏562
27.4.2 CX_LIMITED_RANGE編譯提示563
27.4.3函數564
27.4.4三角函數564
27.4.5雙曲函數565
27.4.6指數函數和對數函數565
27.4.7冪函數和絕對值函數566
27.4.8操作函數566
27.5:泛型數學567
27.5.1泛型宏568
27.5.2調用泛型宏569
27.6:浮點環境570
27.6.1浮點狀態標誌和控制模式570
27.6.2宏571
27.6.3 FENV_ACCESS編譯提示571
27.6.4浮點異常函數572
27.6.5舍入函數573
27.6.6環境函數573
問與答573
練習題574
編程題575

第28章C1X新增的多線程和原子操作支持576
28.1:多線程執行支持577
28.1.1線程啟動函數577
28.1.2線程的創建和管理函數578
28.1.3數據競爭581
28.1.4互斥函數583
28.1.5條件變量585
28.1.6條件變量函數587
28.1.7遞歸鎖和非遞歸鎖591
28.1.8初始化函數591
28.1.9 _Thread_local存儲類和線程存儲期593
28.1.10線程專屬存儲595
28.1.11線程專屬存儲函數596
28.2 _Atomic、:原子類型和原子操作支持599
28.2.1 _Atomic:類型指定符/類型限定符600
28.2.2標準庫定義的原子類型600
28.2.3初始化原子變量601
28.2.4原子變量的初始化函數601
28.2.5原子操作602
28.2.6原子操作函數604
28.2.7內存順序608
28.2.8圍欄函數613
28.2.9鎖無關判斷函數615
28. 2.10原子標誌類型及其操作函數616
問與答619
練習題619
編程題620

附錄AC語言運算符621
附錄B C1X與C99的比較622
附錄C C99與C89的比較624
附錄D C89與經典C的比較628
附錄E標準庫函數631
附錄F ASCII字符集673
延伸閱讀674
索引(圖靈社區下載)