第1章 C:穿越時空的迷霧 1
1.1 C語言的史前階段 1
1.2 C語言的早期體驗 4
1.3 標準I/O庫和C預處理器 5
1.4 K&R C 8
1.5 今日之ANSI C 10
1.6 它很棒,但它符合標準嗎 12
1.7 編譯限制 14
1.8 ANSI C標準的結構 15
1.9 閱讀ANSI C標準,尋找樂趣和裨益 19
1.10 “安靜的改變”究竟有多少安靜 22
1.11 輕松一下——由編譯器定義的Pragmas效果 25
第2章 這不是Bug,而是語言特性 27
2.1 這關語言特性何事,在Fortran里這就是Bug呀 27
2.2 多做之過 29
2.3 誤做之過 36
2.4 少做之過 43
2.5 輕松一下——有些特性確實就是Bug 51
2.6 參考文獻 53
第3章 分析C語言的聲明 55
3.1 只有編譯器才會喜歡的語法 56
3.2 聲明是如何形成的 58
3.3 優(yōu)先級規(guī)則 63
3.4 通過圖表分析C語言的聲明 65
3.5 typedef可以成為你的朋友 67
3.6 typedef int x[10]和#define x int[10]的區(qū)別 68
3.7 typedef struct foo{ ... foo; }的含義 69
3.8 理解所有分析過程的代碼段 71
3.9 輕松一下——驅動物理實體的軟件 73
第4章 令人震驚的事實:數組和指針并不相同 81
4.1 數組并非指針 81
4.2 我的代碼為什么無法運行 81
4.3 什么是聲明,什么是定義 82
4.4 使聲明與定義相匹配 86
4.5 數組和指針的其他區(qū)別 86
4.6 輕松一下——回文的樂趣 88
第5章 對鏈接的思考 91
5.1 函數庫、鏈接和載入 91
5.2 動態(tài)鏈接的優(yōu)點 94
5.3 函數庫鏈接的5個特殊秘密 98
5.4 警惕Interpositioning 102
5.5 產生鏈接器報告文件 107
5.6 輕松一下——看看誰在說話:挑戰(zhàn)Turing測驗 108
第6章 運動的詩章:運行時數據結構 115
6.1 a.out及其傳說 116
6.2 段 117
6.3 操作系統(tǒng)在a.out文件里干了些什么 119
6.4 C語言運行時系統(tǒng)在a.out里干了些什么 121
6.5 當函數被調用時發(fā)生了什么:過程活動記錄 123
6.6 auto和static關鍵字 126
6.7 控制線程 128
6.8 setjmp和longjmp 128
6.9 UNIX中的堆棧段 130
6.10 MS-DOS中的堆棧段 130
6.11 有用的C語言工具 131
6.12 輕松一下——卡耐基-梅隆大學的編程難題 134
6.13 只適用于高級學員閱讀的材料 136
第7章 對內存的思考 137
7.1 Intel 80x86系列 137
7.2 Intel 80x86內存模型以及它的工作原理 141
7.3 虛擬內存 145
7.4 Cache存儲器 148
7.5 數據段和堆 152
7.6 內存泄漏 153
7.7 總線錯誤 157
7.8 輕松一下——“Thing King”和“頁面游戲” 163
第8章 為什么程序員無法分清萬圣節(jié)和圣誕節(jié) 169
8.1 Portzebie度量衡系統(tǒng) 169
8.2 根據位模式構筑圖形 170
8.3 在等待時類型發(fā)生了變化 172
8.4 原型之痛 174
8.5 原型在什么地方會失敗 176
8.6 不需要按回車鍵就能得到一個字符 179
8.7 用C語言實現有限狀態(tài)機 183
8.8 軟件比硬件更困難 185
8.9 如何進行強制類型轉換,為何要進行類型強制轉換 187
8.10 輕松一下——國際C語言混亂代碼大賽 189
第9章 再論數組 199
9.1 什么時候數組與指針相同 199
9.2 為什么會發(fā)生混淆 200
9.3 為什么C語言把數組形參當作指針 205
9.4 數組片段的下標 208
9.5 數組和指針可交換性的總結 209
9.6 C語言的多維數組 209
9.7 輕松一下——軟件/硬件平衡 215
第10章 再論指針 219
10.1 多維數組的內存布局 219
10.2 指針數組就是Iliffe向量 220
10.3 在鋸齒狀數組上使用指針 223
10.4 向函數傳遞一個一維數組 226
10.5 使用指針向函數傳遞一個多維數組 227
10.6 使用指針從函數返回一個數組 230
10.7 使用指針創(chuàng)建和使用動態(tài)數組 232
10.8 輕松一下——程序檢驗的限制 237
第11章 你懂得C,所以C++不在話下 241
11.1 初識OOP 241
11.2 抽象——取事物的本質特性 243
11.3 封裝——把相關的類型、數據和函數組合在一起 245
11.4 展示一些類——用戶定義類型享有和預定義類型一樣的權限 246
11.5 訪問控制 247
11.6 聲明 247
11.7 如何調用成員函數 249
11.8 繼承——復用已經定義的操作 251
11.9 多重繼承——從兩個或更多的基類派生 255
11.10 重載——作用于不同類型的同一操作具有相同的名字 256
11.11 C++如何進行操作符重載 257
11.12 C++的輸入/輸出(I/O) 258
11.13 多態(tài)——運行時綁定 258
11.14 解釋 260
11.15 C++如何表現多態(tài) 261
11.16 新奇玩意——多態(tài) 262
11.17 C++的其他要點 263
11.18 如果我的目標是那里,我不會從這里起步 264
11.19 它或許過于復雜,但卻是惟一可行的方案 266
11.20 輕松一下——死亡計算機協(xié)會 270
11.21 更多閱讀材料 271
附錄A 程序員工作面試的秘密 273
附錄B 術語表 285