《C陷阱與缺陷》作者以自己1985年在貝爾實(shí)驗(yàn)室時(shí)發(fā)表的一篇論文為基礎(chǔ),結(jié)合自己的工作經(jīng)驗(yàn)將這篇論文擴(kuò)展成對(duì)C程序員具有珍貴價(jià)值的經(jīng)典著作。本書的出發(fā)點(diǎn)不是批判C語(yǔ)言,而是要幫助C程序員繞過(guò)編程過(guò)程中的陷阱和障礙。
《C陷阱與缺陷》分為8章,分別從詞法陷阱、語(yǔ)法陷阱、語(yǔ)義陷阱、鏈接、庫(kù)函數(shù)、預(yù)處理器、可一致性缺陷等幾個(gè)方面分析了C編程中可能遇到的問(wèn)題。最后,作者用一章的篇幅給出了若干具有實(shí)用價(jià)值的建議。
《C陷阱與缺陷》適合有一定經(jīng)驗(yàn)的C程序員閱讀學(xué)習(xí),即便你是C編程高手,本書也應(yīng)該成為你的案頭必備圖書。
1.ACCU主席Francis Glassborow傾力推薦,影響了國(guó)內(nèi)外好幾代程序員的經(jīng)典作品;
2.C++業(yè)界資深技術(shù)大神、C++標(biāo)準(zhǔn)委員會(huì)成員、C++沉思錄作者Andrew Koenig的成名著作;
3.全球暢銷30余年,中文版累銷100000+冊(cè);
4.本書的出發(fā)點(diǎn)不是要批判C語(yǔ)言,而是要幫助C程序員繞過(guò)編程過(guò)程中的陷阱和障礙。
聆聽大師教誨 掌握編程精髓
本書對(duì)會(huì)讓程序預(yù)期行為與實(shí)際行為產(chǎn)生很大不同的C語(yǔ)言特性進(jìn)行了詳細(xì)介紹。本書通過(guò)具體的案例和有幫助的建議來(lái)演示并介紹C語(yǔ)言中的這些陷阱與缺陷。本書每章末尾還包含了一些思考和相應(yīng)的討論。
即使是C編程專家,也會(huì)經(jīng)常遇到一些需要數(shù)天調(diào)試才能修復(fù)的問(wèn)題。本書中的每個(gè)示例都會(huì)讓C程序員陷入困境,本書將通過(guò)展示這些困境來(lái)幫助讀者預(yù)防這些問(wèn)題。
除了書中的這些示例之外,本書還提供了下面這些建議:
避免離一(off-by-one)錯(cuò)誤;
理解和構(gòu)建函數(shù)聲明;
理解指針和數(shù)組之間的微妙關(guān)系。
本書源自作者十多年的C編程經(jīng)驗(yàn)總結(jié),對(duì)于任何曾經(jīng)編寫過(guò)C程序的人來(lái)說(shuō)(無(wú)論是新手還是專家),本手都是理想的閱讀資料。
Andrew Koenig,AT&T大規(guī)模程序研發(fā)部(前貝爾實(shí)驗(yàn)室)成員。他從1986年開始從事C語(yǔ)言的研究,1977年加入貝爾實(shí)驗(yàn)室。他編寫了一些早期的類庫(kù),并在1988年組織召開了第一個(gè)具有相當(dāng)規(guī)模的C++會(huì)議。在ISO/ANSI C++委員會(huì)成立的1989年,他就加入了該委員會(huì),并一直擔(dān)任項(xiàng)目編輯。他已經(jīng)發(fā)表了100多篇C++方面的論文,并在Addsion-Wesley出版了C Traps and Pitfalls 一書(中文版名為《C缺陷與陷阱》,由人民郵電出版社出版),還應(yīng)邀到世界各地演講。
Anderw Koenig不僅有著多年的C++開發(fā)、研究和教學(xué)經(jīng)驗(yàn),而且還親身參與了C++的演化和變革,對(duì)C++的變化和發(fā)展產(chǎn)生了重要的影響。
第0章 導(dǎo)讀\t1
第 1章 詞法“陷阱” 5
1.1 =不同于== 6
1.2 & 和 | 不同于&& 和 || 8
1.3 詞法分析中的“貪心法” 8
1.4 整型常量 10
1.5 字符與字符串 11
第 2章 語(yǔ)法“陷阱” 15
2.1 理解函數(shù)聲明 15
2.2 運(yùn)算符的優(yōu)先級(jí)問(wèn)題 19
2.3 注意作為語(yǔ)句結(jié)束標(biāo)志的分號(hào) 24
2.4 switch語(yǔ)句 26
2.5 函數(shù)調(diào)用 28
2.6 “懸掛”else引發(fā)的問(wèn)題 28
第3章 語(yǔ)義“陷阱” 33
3.1 指針與數(shù)組 33
3.2 非數(shù)組的指針 39
3.3 作為參數(shù)的數(shù)組聲明 41
3.4 避免“舉隅法” 43
3.5 空指針并非空字符串 44
3.6 邊界計(jì)算與不對(duì)稱邊界 45
3.7 求值順序 57
3.8 運(yùn)算符&&、|| 和 ! 59
3.9 整數(shù)溢出 61
3.10 為函數(shù)main提供返回值 62
第4章 鏈接 65
4.1 什么是鏈接器 65
4.2 聲明與定義 67
4.3 命名沖突與static修飾符 69
4.4 形參、實(shí)參與返回值 70
4.5 檢查外部類型 77
4.6 頭文件 80
第5章 庫(kù)函數(shù) 83
5.1 返回整數(shù)的getchar函數(shù) 84
5.2 更新順序文件 85
5.3 緩沖輸出與內(nèi)存分配 86
5.4 使用errno檢測(cè)錯(cuò)誤 88
5.5 庫(kù)函數(shù)signal 89
第6章 預(yù)處理器 93
6.1 不能忽視宏定義中的空格 94
6.2 宏并不是函數(shù) 94
6.3 宏并不是語(yǔ)句 99
6.4 宏并不是類型定義 101
第7章 可移植性缺陷 103
7.1 應(yīng)對(duì)C語(yǔ)言標(biāo)準(zhǔn)變更 104
7.2 標(biāo)識(shí)符名稱的限制 106
7.3 整數(shù)的大小 107
7.4 字符是有符號(hào)整數(shù)還是無(wú)符號(hào)整數(shù) 108
7.5 移位運(yùn)算符 109
7.6 內(nèi)存位置0 110
7.7 除法運(yùn)算時(shí)發(fā)生的截?cái)唷?11
7.8 隨機(jī)數(shù)的大小 113
7.9 大小寫轉(zhuǎn)換 113
7.10 首先釋放,然后重新分配 115
7.11 可移植性問(wèn)題的一個(gè)例子 116
第8章 建議與答案 123
8.1 建議 124
8.2 答案 128
附錄A printf、varargs與stdarg 147
附錄B Koenig和Moo夫婦訪談 169