本書帶領(lǐng)讀者通過練習(xí)掌握編寫現(xiàn)代C程序的方法和技巧。全書分為11章,首先概述C語言編程的基本概念,然后詳解C語言的所有構(gòu)成要素,包括變量、對象、函數(shù)、數(shù)據(jù)類型、運(yùn)算符、表達(dá)式、控制流、動態(tài)內(nèi)存分配、預(yù)處理器等,最后帶領(lǐng)讀者利用這些構(gòu)成要素構(gòu)建實(shí)用的系統(tǒng),學(xué)習(xí)如何調(diào)試、測試、分析代碼。學(xué)透本書,你就能成為專業(yè)的C程序員,編寫出安全、高質(zhì)量、可移植的C程序。
本書適合所有想編寫優(yōu)秀C程序的讀者閱讀。
1.C語言在TIOBE編程語言排行榜上長期名列前茅,本書帶你探尋它的奧秘,領(lǐng)略編程的神奇與巧妙。
2.語言簡練,易學(xué)易懂,旨在幫助你不走彎路,編寫出安全、可靠、高質(zhì)量的C程序。
3.作為C語言標(biāo)準(zhǔn)委員會專家,作者從頭到尾參與了C語言標(biāo)準(zhǔn)C11、C17和C23的制定,行文思路清晰明了,不僅能讓你掌握C語言及其標(biāo)準(zhǔn)庫,還將有能力測試、調(diào)試和分析C程序。
4.本書內(nèi)容豐富靠譜,涵蓋C17和C2x,并由C語言標(biāo)準(zhǔn)委員會的多位成員審定。
羅伯特·C. 西科德(Robert C. Seacord),C語言標(biāo)準(zhǔn)委員會專家,從頭到尾參與了C語言標(biāo)準(zhǔn)C11、C17和C23的制定。羅伯特也是Linux基金會顧問,還兼任卡內(nèi)基?梅隆大學(xué)計算機(jī)科學(xué)教授,并一手創(chuàng)辦了卡內(nèi)基?梅隆大學(xué)軟件工程學(xué)院的安全編程項(xiàng)目。羅伯特發(fā)表了50余篇論文,主題涵蓋軟件安全、軟件工程、Web系統(tǒng)設(shè)計、遺留系統(tǒng)現(xiàn)代化、搜索引擎、用戶界面設(shè)計等,另有《C安全編碼標(biāo)準(zhǔn)》《C和C++安全編碼》等6部著作。
第 1章 C語言入門 1
1.1 編寫第 一個C程序 1
1.1.1 編譯并運(yùn)行程序 2
1.1.2 預(yù)處理器指令 3
1.1.3 main函數(shù) 3
1.1.4 檢查函數(shù)返回值
1.1.5 格式化輸出 5
1.2 編輯器和集成式開發(fā)環(huán)境 5
1.3 編譯器 7
1.3.1 GNU編譯器合集 7
1.3.2 Clang 8
1.3.3 Microsoft Visual Studio 8
1.4 可移植性 8
1.4.1 由實(shí)現(xiàn)定義的行為 9
1.4.2 未指定行為 9
1.4.3 未定義行為 10
1.4.4 特定區(qū)域設(shè)置行為和通用擴(kuò)展 11
1.5 小結(jié) 11
第 2章 對象、函數(shù)和類型 12
2.1 對象、函數(shù)、類型和指針 12
2.2 聲明變量 13
2.2.1 交換值(初次嘗試)14
2.2.2 交換值(再次嘗試) 15
2.3 作用域 17
2.4 存儲期 18
2.5 對齊方式 19
2.6 對象類型 20
2.6.1 布爾類型 20
2.6.2 字符類型 21
2.6.3 數(shù)值類型 21
2.7 函數(shù)類型 23
2.8 派生類型 24
2.8.1 指針類型 24
2.8.2 數(shù)組 25
2.8.3 結(jié)構(gòu) 27
2.8.4 聯(lián)合 27
2.9 標(biāo)簽 28
2.10 類型限定符 30
2.10.1 const 30
2.10.2 volatile 31
2.10.3 restrict 32
2.11 練習(xí) 32
2.12 小結(jié) 32
第3章 算術(shù)類型 33
3.1 整數(shù) 33
3.1.1 填充和精度 33
3.1.2 頭文件 34
3.1.3 聲明整數(shù) 34
3.1.4 無符號整數(shù) 35
3.1.5 有符號整數(shù) 37
3.1.6 整數(shù)常量 41
3.2 浮點(diǎn) 42
3.2.1 浮點(diǎn)類型 42
3.2.2 浮點(diǎn)算術(shù) 44
3.2.3 浮點(diǎn)值 44
3.2.4 浮點(diǎn)常量 46
3.3 算術(shù)轉(zhuǎn)換 46
3.3.1 整數(shù)轉(zhuǎn)換等級 47
3.3.2 整數(shù)提升 48
3.3.3 尋常算術(shù)轉(zhuǎn)換 49
3.3.4 隱式轉(zhuǎn)換示例 50
3.3.5 安全轉(zhuǎn)換 51
3.4 小結(jié) 52
第4章 表達(dá)式和運(yùn)算符 53
4.1 簡單賦值 53
4.2 求值 55
4.3 函數(shù)調(diào)用 55
4.4 遞增運(yùn)算符和遞減運(yùn)算符 56
4.5 運(yùn)算符優(yōu)先級和結(jié)合性 57
4.6 求值順序 59
4.6.1 無序求值和不定序求值 60
4.6.2 順序點(diǎn) 61
4.7 sizeof運(yùn)算符 61
4.8 算術(shù)運(yùn)算符 62
4.8.1 單目運(yùn)算符+和- 62
4.8.2 邏輯否運(yùn)算符 63
4.8.3 乘積運(yùn)算符 63
4.8.4 累加運(yùn)算符 64
4.9 按位運(yùn)算符 64
4.9.1 求反運(yùn)算符 65
4.9.2 移位運(yùn)算符 65
4.9.3 按位與運(yùn)算符 67
4.9.4 按位異或運(yùn)算符 67
4.9.5 按位或運(yùn)算符 68
4.10 邏輯運(yùn)算符 68
4.11 轉(zhuǎn)換運(yùn)算符 70
4.12 條件運(yùn)算符 71
4.13 _Alignof運(yùn)算符 71
4.14 關(guān)系運(yùn)算符 72
4.15 復(fù)合賦值運(yùn)算符 73
4.16 逗號運(yùn)算符 73
4.17 指針?biāo)阈g(shù) 74
4.18 小結(jié) 75
第5章 控制流 76
5.1 表達(dá)式語句 76
5.2 復(fù)合語句 77
5.3 選擇語句 77
5.3.1 if語句 77
5.3.2 switch語句 80
5.4 迭代語句 83
5.4.1 while語句 83
5.4.2 do...while語句 84
5.4.3 for語句 85
5.5 跳轉(zhuǎn)語句 87
5.5.1 goto語句 87
5.5.2 continue語句 89
5.5.3 break語句 89
5.5.4 return語句 90
5.6 練習(xí) 91
5.7 小結(jié) 91
第6章 動態(tài)分配內(nèi)存 92
6.1 存儲期 92
6.1.1 堆和內(nèi)存管理器 93
6.1.2 什么時候使用動態(tài)分配內(nèi)存 93
6.2 內(nèi)存管理函數(shù) 94
6.2.1 malloc函數(shù) 94
6.2.2 aligned_alloc函數(shù) 96
6.2.3 calloc函數(shù) 97
6.2.4 realloc函數(shù) 97
6.2.5 reallocarray函數(shù) 99
6.2.6 free函數(shù) 100
6.3 內(nèi)存狀態(tài) 101
6.4 柔性數(shù)組成員 102
6.5 其他的動態(tài)分配內(nèi)存 103
6.5.1 alloca函數(shù) 103
6.5.2 變長數(shù)組 104
6.6 調(diào)試存儲分配問題 108
6.6.1 dmalloc 108
6.6.2 安全關(guān)鍵型系統(tǒng) 110
6.7 練習(xí) 110
6.8 小結(jié) 110
第7章 字符和字符串 111
7.1 字符 111
7.1.1 ASCII 112
7.1.2 Unicode 112
7.1.3 源字符集和執(zhí)行字符集 113
7.1.4 數(shù)據(jù)類型 114
7.1.5 字符常量 116
7.1.6 轉(zhuǎn)義序列 116
7.1.7 Linux 117
7.1.8 Windows 118
7.1.9 字符轉(zhuǎn)換 119
7.2 字符串 123
7.3 字符串處理函數(shù) 125
7.3.1 和 126
7.3.2 附錄K:邊界檢查接口 132
7.3.3 POSIX 134
7.3.4 Microsoft 135
7.4 小結(jié) 136
第8章 輸入/輸出 137
8.1 標(biāo)準(zhǔn)I/O流 137
8.1.1 流緩沖 138
8.1.2 預(yù)定義流 138
8.1.3 流傾向 140
8.1.4 文本流和二進(jìn)制流 140
8.2 打開文件和創(chuàng)建文件 140
8.2.1 fopen函數(shù) 140
8.2.2 POSIX 的open函數(shù) 142
8.3 關(guān)閉文件 144
8.3.1 fclose函數(shù) 144
8.3.2 POSIX的close函數(shù) 145
8.4 讀寫字符和行 145
8.5 流沖洗 147
8.6 設(shè)置文件內(nèi)部位置 148
8.7 刪除文件和重命名文件 150
8.8 使用臨時文件 151
8.9 讀取格式化文本流 151
8.10 讀寫二進(jìn)制流 154
8.11 小結(jié) 157
第9章 預(yù)處理器 159
9.1 編譯過程 159
9.2 文件包含 160
9.3 條件包含 161
9.3.1 生成錯誤 162
9.3.2 頭文件保護(hù) 163
9.4 宏定義 164
9.4.1 宏替換 167
9.4.2 泛型宏 169
9.4.3 預(yù)定義宏 169
9.5 小結(jié) 170
第 10章 程序結(jié)構(gòu) 171
10.1 組件化原則 171
10.1.1 耦合和內(nèi)聚 171
10.1.2 代碼復(fù)用 172
10.1.3 數(shù)據(jù)抽象 172
10.1.4 不透明類型 173
10.2 可執(zhí)行文件 174
10.3 鏈接 175
10.4 組織一個簡單的程序 177
10.5 構(gòu)建代碼 181
10.6 小結(jié) 183
第 11章 調(diào)試、測試和分析 184
11.1 斷言 184
11.1.1 靜態(tài)斷言 184
11.1.2 運(yùn)行期斷言 186
11.2 編譯器設(shè)置和選項(xiàng) 188
11.2.1 GCC和Clang 188
11.2.2 Visual C++ 191
11.3 調(diào)試 192
11.4 單元測試 195
11.5 靜態(tài)分析 198
11.6 動態(tài)分析 200
11.7 練習(xí) 204
11.8 小結(jié) 205
參考文獻(xiàn) 206