前言
第一篇 預備知識篇
第1章 C魔法概覽 /2
1.1 例說編程語言 2
1.2 用C語言編程的基本注意事項 6
1.3 主流C語言編譯器介紹 8
1.4 關於GNU規範的語法擴展 10
1.5 用C語言構建一個可執行程序的流程 11
1.6 本章小結 12
第2章 學習C語言的預備知識 /14
2.1 計算機體係結構簡介 14
2.1.1 貯存器 15
2.1.2 存儲器 15
2.1.3 寄存器 16
2.1.4 計算單元 16
2.1.5 程序執行流程 16
2.2 整數在計算機中的錶示 17
2.2.1 原碼錶示法 18
2.2.2 補碼錶示法 19
2.2.3 八進製數與十六進製數 20
2.3 浮點數在計算機中的錶示 22
2.4 地址與字節對齊 24
2.5 字符編碼 25
2.6 大端與小端 28
2.7 按位邏輯運算 28
2.8 移位操作 30
2.8.1 算術左移與邏輯左移 30
2.8.2 邏輯右移 30
2.8.3 算術右移 31
2.8.4 循環右移 32
2.9 本章小結 32
第3章 C語言編程的環境搭建 /33
3.1 Windows操作係統下搭建C語言編程環境 33
3.1.1 安裝Visual Studio Community 2017 34
3.1.2 安裝MinGW編譯器 40
3.1.3 安裝LLVM Clang編譯器 43
3.2 macOS係統下搭建C語言編程環境 45
3.3 本章小結 51
第二篇 基礎語法篇
第4章 C語言中的基本元素 /54
4.1 C語言中的字符集 55
4.2 C語言中的token 56
4.2.1 C語言中的標識符 57
4.2.2 C語言中的關鍵字 58
4.2.3 C語言中的常量與字符串字麵量 60
4.2.4 C語言中的標點符號 60
4.3 關於C語言中的“對象” 62
4.4 C語言中的“副作用” 63
4.5 C語言標準庫中的printf函數 63
4.6 本章小結 65
第5章 基本數據類型 /66
5.1 整數類型 66
5.1.1 int類型 67
5.1.2 short類型 68
5.1.3 long類型 69
5.1.4 long long類型 71
5.1.5 布爾類型 72
5.1.6 字符類型 73
5.1.7 寬字符以及Unicode字符類型 77
5.1.8 size_t與ptrdiff_t類型 81
5.1.9 C語言中的標準整數類型 82
5.2 浮點類型 84
5.3 數據精度與類型轉換 86
5.3.1 整數晉升 87
5.3.2 帶符號與無符號整數之間的轉換 87
5.3.3 浮點數與浮點數的轉換以及浮點數與整數之間的轉換 90
5.4 C語言基本運算操作符 92
5.4.1 加、減、乘、除與求模運算操作符 92
5.4.2 按位邏輯操作符 93
5.4.3 自增、自減操作符 94
5.4.4 關係操作符、相等性操作符與邏輯操作符 95
5.4.5 移位操作符 96
5.4.6 圓括號操作符 97
5.5 sizeof操作符 98
5.6 投射操作符 99
5.7 本章小結 101
第6章 用戶自定義類型 /102
6.1 枚舉類型 102
6.2 結構體類型 105
6.2.1 結構體概述 105
6.2.2 用結構體創建對象並訪問其成員 107
6.2.3 結構體復閤字麵量 110
6.3 聯閤體類型 113
6.4 位域 117
6.4.1 位域的一般特性 118
6.4.2 位域成員的存放與布局 120
6.4.3 匿名位域 122
6.4.4 位域使用示例 124
6.5 字節對齊與字節填充 125
6.5.1 _Alignof操作符 125
6.5.2 _Alignas對齊說明符 126
6.5.3 結構體成員的字節對齊與字節填充 129
6.6 復數類型 133
6.7 本章小結 135
第7章 C語言的數組與指針 /136
7.1 一維數組 136
7.2 多維數組 141
7.3 變長數組 145
7.4 一級指針與對象地址 147
7.4.1 地址與指針的基本概念 148
7.4.2 訪問指針對象所指對象的內容 149
7.4.3 指針對象的其他操作 150
7.5 多級指針 153
7.6 指嚮用戶自定義類型的指針 156
7.7 指針與數組的關係 159
7.8 指嚮數組的指針 162
7.9 void類型、指嚮void類型的指針與空指針 165
7.10 字符數組與字符串字麵量 167
7.11 完整與不完整類型 170
7.12 靈活的數組成員 171
7.13 本章小結 173
第8章 C語言的控製流語句 /174
8.1 逗號錶達式 174
8.2 條件錶達式 176
8.3 if-else語句 176
8.4 switch-case語句 179
8.5 while與do-while迭代語句 182
8.6 for迭代語句 187
8.7 goto語句 189
8.8 本章小結 192
第9章 C語言的函數 /193
9.1 函數的聲明與定義 194
9.2 函數調用與實現 196
9.2.1 函數調用的順序點 197
9.2.2 函數的棧空間 200
9.2.3 函數的參數傳遞與返迴 201
9.2.4 通過形參修改實參的值 204
9.3 數組類型作為函數形參 205
9.4 帶有不定參數類型及個數的函數聲明與調用 209
9.5 函數的遞歸調用 212
9.6 內聯函數 218
9.7 函數的返迴類型與無返迴函數 221
9.8 指嚮函數的指針 223
9.9 C語言中的主函數main 226
9.10 函數與函數調用作為sizeof操作符 228
9.11 本章小結 229
第10章 C語言預處理器 /230
10.1 宏定義 231
10.1.1 宏的基本使用 232
10.1.2 宏定義中的#操作符 234
10.1.3 宏定義中的##操作符 236
10.1.4 宏替換 238
10.1.5 可變參數的宏定義 240
10.2 C語言中預定義的宏 243
10.2.1 C語言強製要求的預定義宏 243
10.2.2 環境宏 244
10.2.3 條件特徵宏 245
10.2.4 主流編譯器及平颱預定義的宏 246
10.3 條件預編譯 247
10.4 源文件包含預處理指示符 251
10.5 #error 預處理指示符 256
10.6 #line 預處理指示符 256
10.7 #undef 預處理指示符 257
10.8 pragma預編譯指示符與操作符 258
10.9 空指示符與C語言中的程序注釋 260
10.10 本章小結 262
第11章 C語言程序的編譯上下文 /263
11.1 C語言程序中的作用域和名字空間 263
11.1.1 文件作用域 264
11.1.2 函數作用域 265
11.1.3 函數原型作用域 266
11.1.4 語句塊作用域 267
11.1.5 標識符的重定義與作用域的疊交 269
11.1.6 標識符的名字空間 272
11.2 全局對象與函數 275
11.3 靜態對象與函數 277
11.4 局部對象 280
11.5 對象的存儲與生命周期 282
11.6 _Thread_local對象 285
11.7 本章小結 286
第三篇 高級語法篇
第12章 C語言中的類型限定符 /290
12.1 const限定符 290
12.1.1 const限定符修飾普通對象 291
12.1.2 const限定符修飾數組元素 293
12.1.3 const限定符修飾指針類型對象 294
12.1.4 const限定符修飾函數形參類型為數組的對象 299
12.1.5 類型限定符的本質含義 301
12.2 volatile限定符 302
12.3 restrict限定符 304
12.4 _Atomic限定符 307
12.5 本章小結 314
第13章 C語言的類型係統 /316
13.1 對象類型與函數類型 316
13.2 對聲明符的進一步說明 318
13.3 更復雜的聲明 322
13.3.1 將某一類型轉換為指嚮該類型的指針 322
13.3.2 判定當前類型屬於哪種對象類型 322
13.3.3 復雜復閤類型的判斷 324
13.4 typedef類型定義 327
13.4.1 typedef的一般使用 327
13.4.2 typedef與類型限定符相結閤的使用 330
13.4.3 用typedef來定義結構體與聯閤體的類型 332
13.5 本章小結 335
第14章 C11標準中的錶達式、左值與求值順序 /336
14.1 常量錶達式 338
14.2 泛型選擇錶達式 340
14.3 靜態斷言 343
14.4 C語言中的左值 344
14.5 C語言中錶達式的求值順序 348
14.6 C語言中的語句 352
14.7 本章小結 355
第15章 函數調用約定與ABI /356
15.1 Windows操作係統環境下x86處理器的函數調用約定 357
15.1.1 Windows操作係統下32位x86執行模式的函數調用約定 357
15.1.2 Windows操作係統下64位x86執行模式的函數調用約定 363
15.2 Unix/Linux操作係統環境下x86處理器的函數調用約定 368
15.3 ARM處理器環境下的函數調用約定 370
15.3.1 AArch32架構環境下的函數調用約定 370
15.3.2 AArch64架構環境下的函數調用約定 373
15.4 本章小結 375
第16章 創建靜態庫與動態庫 /376
16.1 Windows係統下創建靜態庫與動態庫 377
16.1.1 Windows係統下創建並使用靜態庫 377
16.1.2 Windows係統上創建並使用動態庫 379
16.2 macOS係統下創建靜態庫與動態庫 382
16.2.1 macOS係統下創建並使用靜態庫 383
16.2.2 macOS係統下創建並使用動態庫 386
16.3 Linux係統下創建並使用靜態庫與動態庫 390
16.3.1 Linux係統下創建並使用靜態庫文件 390
16.3.2 Linux係統下創建並使用動態庫 391
16.4 本章小結 393
第四篇 語法擴展篇
第17章 GCC對C11標準的語法擴展 /396
17.1 在錶達式中使用復閤語句與聲明 397
17.2 聲明語句塊作用域的跳轉標簽 398
17.3 跳轉標簽作為值 401
17.4 嵌套函數 402
17.5 使用typeof來獲取對象類型 405
17.6 使用__auto_type做類型自動推導 409
17.7 對復數操作的擴展 411
17.8 半精度浮點類型 412
17.9 長度為零的數組 413
17.10 對可變參數個數的宏的語法擴展 415
17.11 case語句中使用範圍錶達式 417
17.12 投射到一個聯閤體類型 418
17.13 使用二進製整數字麵量 419
17.14 使用__attribute__指定函數、對象與類型的屬性 420
17.14.1 __attribute__用於修飾函數的屬性 422
17.14.2 __attribute__用於修飾對象的屬性 440
17.14.3 __attribute__用於修飾類型的屬性 443
17.15 本章小結 444
第18章 Clang編譯器對C11標準的擴展 /445
18.1 特徵檢查宏 446
18.2 _Nullable與_Nonnull 446
18.3 函數重載 448
18.4 Blocks語法 449
18.5 本章小結 462
第19章 對C語言的未來展望 /463
19.1 C語言中的屬性 465
19.2 fallthrough屬性 466
19.3 數組片段 467
19.3.1 數組片段的賦值操作 468
19.3.2 數組片段的算術計算操作 470
19.3.3 數組片段用於函數調用的情況 471
19.4 其他語法特性 472
19.5 本章小結 472
第五篇 項目實踐篇
第20章 製作UTF-8與UTF-16編碼字符串的轉碼器 /474
20.1 UTF-8字符編碼格式 474
20.2 UTF-16字符編碼格式 476
20.3 代碼示例 478
20.4 本章小結 487
第21章 製作控製颱計算器 /488
21.1 對數字的解析 489
21.2 對操作符的優先級處理 489
21.3 代碼示例 491
21.4 本章小結 504
· · · · · · (
收起)