本書帶領讀者通過練習掌握編寫現(xiàn)代C程序的方法和技巧。全書分為11章,首先概述C語言編程的基本概念,然后詳解C語言的所有構成要素,包括變量、對象、函數(shù)、數(shù)據(jù)類型、運算符、表達式、控制流、動態(tài)內存分配、預處理器等,最后帶領讀者利用這些構成要素構建實用的系統(tǒng),學習如何調試、測試、分析代碼。學透本書,你就能成為專業(yè)的C程序員,編寫出安全、高質量、可移植的C程序。
本書適合所有想編寫優(yōu)秀C程序的讀者閱讀。
1.C語言在TIOBE編程語言排行榜上長期名列前茅,本書帶你探尋它的奧秘,領略編程的神奇與巧妙。
2.語言簡練,易學易懂,旨在幫助你不走彎路,編寫出安全、可靠、高質量的C程序。
3.作為C語言標準委員會專家,作者從頭到尾參與了C語言標準C11、C17和C23的制定,行文思路清晰明了,不僅能讓你掌握C語言及其標準庫,還將有能力測試、調試和分析C程序。
4.本書內容豐富靠譜,涵蓋C17和C2x,并由C語言標準委員會的多位成員審定。
羅伯特·C. 西科德(Robert C. Seacord),C語言標準委員會專家,從頭到尾參與了C語言標準C11、C17和C23的制定。羅伯特也是Linux基金會顧問,還兼任卡內基?梅隆大學計算機科學教授,并一手創(chuàng)辦了卡內基?梅隆大學軟件工程學院的安全編程項目。羅伯特發(fā)表了50余篇論文,主題涵蓋軟件安全、軟件工程、Web系統(tǒng)設計、遺留系統(tǒng)現(xiàn)代化、搜索引擎、用戶界面設計等,另有《C安全編碼標準》《C和C++安全編碼》等6部著作。
第 1章 C語言入門 1
1.1 編寫第 一個C程序 1
1.1.1 編譯并運行程序 2
1.1.2 預處理器指令 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 由實現(xiàn)定義的行為 9
1.4.2 未指定行為 9
1.4.3 未定義行為 10
1.4.4 特定區(qū)域設置行為和通用擴展 11
1.5 小結 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 結構 27
2.8.4 聯(lián)合 27
2.9 標簽 28
2.10 類型限定符 30
2.10.1 const 30
2.10.2 volatile 31
2.10.3 restrict 32
2.11 練習 32
2.12 小結 32
第3章 算術類型 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 浮點 42
3.2.1 浮點類型 42
3.2.2 浮點算術 44
3.2.3 浮點值 44
3.2.4 浮點常量 46
3.3 算術轉換 46
3.3.1 整數(shù)轉換等級 47
3.3.2 整數(shù)提升 48
3.3.3 尋常算術轉換 49
3.3.4 隱式轉換示例 50
3.3.5 安全轉換 51
3.4 小結 52
第4章 表達式和運算符 53
4.1 簡單賦值 53
4.2 求值 55
4.3 函數(shù)調用 55
4.4 遞增運算符和遞減運算符 56
4.5 運算符優(yōu)先級和結合性 57
4.6 求值順序 59
4.6.1 無序求值和不定序求值 60
4.6.2 順序點 61
4.7 sizeof運算符 61
4.8 算術運算符 62
4.8.1 單目運算符+和- 62
4.8.2 邏輯否運算符 63
4.8.3 乘積運算符 63
4.8.4 累加運算符 64
4.9 按位運算符 64
4.9.1 求反運算符 65
4.9.2 移位運算符 65
4.9.3 按位與運算符 67
4.9.4 按位異或運算符 67
4.9.5 按位或運算符 68
4.10 邏輯運算符 68
4.11 轉換運算符 70
4.12 條件運算符 71
4.13 _Alignof運算符 71
4.14 關系運算符 72
4.15 復合賦值運算符 73
4.16 逗號運算符 73
4.17 指針算術 74
4.18 小結 75
第5章 控制流 76
5.1 表達式語句 76
5.2 復合語句 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 跳轉語句 87
5.5.1 goto語句 87
5.5.2 continue語句 89
5.5.3 break語句 89
5.5.4 return語句 90
5.6 練習 91
5.7 小結 91
第6章 動態(tài)分配內存 92
6.1 存儲期 92
6.1.1 堆和內存管理器 93
6.1.2 什么時候使用動態(tài)分配內存 93
6.2 內存管理函數(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 內存狀態(tài) 101
6.4 柔性數(shù)組成員 102
6.5 其他的動態(tài)分配內存 103
6.5.1 alloca函數(shù) 103
6.5.2 變長數(shù)組 104
6.6 調試存儲分配問題 108
6.6.1 dmalloc 108
6.6.2 安全關鍵型系統(tǒng) 110
6.7 練習 110
6.8 小結 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 轉義序列 116
7.1.7 Linux 117
7.1.8 Windows 118
7.1.9 字符轉換 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 小結 136
第8章 輸入/輸出 137
8.1 標準I/O流 137
8.1.1 流緩沖 138
8.1.2 預定義流 138
8.1.3 流傾向 140
8.1.4 文本流和二進制流 140
8.2 打開文件和創(chuàng)建文件 140
8.2.1 fopen函數(shù) 140
8.2.2 POSIX 的open函數(shù) 142
8.3 關閉文件 144
8.3.1 fclose函數(shù) 144
8.3.2 POSIX的close函數(shù) 145
8.4 讀寫字符和行 145
8.5 流沖洗 147
8.6 設置文件內部位置 148
8.7 刪除文件和重命名文件 150
8.8 使用臨時文件 151
8.9 讀取格式化文本流 151
8.10 讀寫二進制流 154
8.11 小結 157
第9章 預處理器 159
9.1 編譯過程 159
9.2 文件包含 160
9.3 條件包含 161
9.3.1 生成錯誤 162
9.3.2 頭文件保護 163
9.4 宏定義 164
9.4.1 宏替換 167
9.4.2 泛型宏 169
9.4.3 預定義宏 169
9.5 小結 170
第 10章 程序結構 171
10.1 組件化原則 171
10.1.1 耦合和內聚 171
10.1.2 代碼復用 172
10.1.3 數(shù)據(jù)抽象 172
10.1.4 不透明類型 173
10.2 可執(zhí)行文件 174
10.3 鏈接 175
10.4 組織一個簡單的程序 177
10.5 構建代碼 181
10.6 小結 183
第 11章 調試、測試和分析 184
11.1 斷言 184
11.1.1 靜態(tài)斷言 184
11.1.2 運行期斷言 186
11.2 編譯器設置和選項 188
11.2.1 GCC和Clang 188
11.2.2 Visual C++ 191
11.3 調試 192
11.4 單元測試 195
11.5 靜態(tài)分析 198
11.6 動態(tài)分析 200
11.7 練習 204
11.8 小結 205
參考文獻 206