C陷阱与缺陷 (08年度畅销榜TOP50)
基本信息
- 原书名: C Traps and Pitfalls
- 原出版社: Addison-Wesley Professional
编辑推荐
上架首月即进入china-pub畅销榜TOP10
Andrew Koenin成名之作..
本书所揭示的知识,至少能够帮助你减少C代码和初级C++代码中90%的Bug
聆听大师教诲 掌握编程精髓...
推荐阅读
内容简介回到顶部↑
作者以自己1985年在bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对c程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判c语言,而是要帮助c程序员绕过编程过程中的陷阱和障碍。
全书分为 8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了c编程中可能遇到的问题。最后,作者用一章的篇幅给出了若干具有实用价值的建议。
本书适合有一定经验的c程序员阅读学习,即便你是c编程高手,本书也应该成为你的案头必备书籍。
全书分为 8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了c编程中可能遇到的问题。最后,作者用一章的篇幅给出了若干具有实用价值的建议。
本书适合有一定经验的c程序员阅读学习,即便你是c编程高手,本书也应该成为你的案头必备书籍。
作译者回到顶部↑
本书提供作译者介绍
Andrew Koenig AT&T大规模程序研发部(莉贝尔实验室)成员。他从1 986年开始从事C语言的研究,1977年加入贝尔实验室。在1989年ISO/ANSI C++委员会成立时,他就加入了该委员会,并一直担任项目编辑;他还是《Rumirlatio rls on C++》(C++沉思录)、《CTraps and Pitfalls》的作者。
.. << 查看详细
.. << 查看详细
目录回到顶部↑
第0章 导读
第1章 词法“陷阱”
1.1 =不同于==
1.2 &和
第1章 词法“陷阱”
1.1 =不同于==
1.2 &和
前言回到顶部↑
对于经验丰富的行家而言,得心应手的工具在初学时的困难程度往往要超过那些容易上手的工具。刚刚接触飞机驾驶的学员,初航时总是谨小慎微,只敢沿着海岸线来回飞行,等他们稍有经验就会明白这样的飞行其实是一件多么轻松的事。初学骑自行车的新手,可能觉得后轮两侧的辅助轮很有帮助,但一旦熟练过后,就会发现它们很是碍手碍脚。.
这种情况对程序设计语言也是一样。任何一种程序设计语言,总存在一些语言特性,很可能会给还没有完全熟悉它们的人带来麻烦。令人吃惊的是,这些特性虽然因程序设计语言的不同而异,但对于特定的一种语言,几乎每个程序员都是在同样的一些特性上犯过错误、吃过苦头!因此,作者也就萌生了将这些程序员易犯错误的特性加以收集、整理的最初念头。
我第一次尝试收集这类问题是在1977年。当时,在华盛顿特区举行的一次SHARE(IBM大型机用户组)会议上,我作了一次题为“PL/I中的问题与‘陷阱”的发言。作此发言时,我刚从哥伦比亚大学调至AT&T的贝尔实验室,在哥伦比亚大学我们主要的开发语言是PL/I,而贝尔实验室中主要的开发语言却是C。在贝尔实验室工作的10年间,我积累了丰富的经验,深谙C程序员(也包括我本人)在开发时如果一知半解将会遇到多少麻烦。
1985年,我开始收集有关C语言的此类问题,并在年底将结果整理后作为一篇内部论文发表。这篇论文所引发的回应却大大出乎我的意料,共有2000多人向贝尔实验室的图书馆索取该论文的副本!我由此确信有必要将该论文的内容进一步扩充,于是就写成了现在读者所看到的这本书。
本书是什么
本书力图通过揭示一般程序员,甚至是经验老道的职业程序员,如何在编程中犯错误、摔跟头,以提倡和鼓励预防性的程序设计。这些错误实际上一旦被程序员真正认识和理解,并不难避免。因此,本书阐述的重点不是·般原则,而是一个个具体的例子。
如果你是一个程序员并且开发中真正用到C语言来解决复杂问题,这本书应该成为你的案头必备书籍。即使你已经是一个C语言的专家级程序员,仍然有必要拥有这本书,很多读过本书早期手稿的专业C程序员常常感叹:“就在上星期我还遇到这样一个Bug!”如果你正在教授C语言课程,本书毫无疑问应该成为你向学生推荐的首选补充阅读材料。
本书不是什么
本书不是对C语言的批评。程序员无论使用何种程序设计语言,都有可能遇到麻烦。本书浓缩了作者长达10年的C语言开发经验,集中阐述了C语言中各种问题和“陷阱”,目的是希望程序员读者能够从中吸取我本人以及我所见过的其他人所犯错误的经验教训。
本书不是一本“烹饪菜谱”。我们不能希望可以通过详尽的指导说明来完全避免错误。如果可行的话,那么所有的交通事故都可以通过在路旁刷上“小心驾驶”的标语来杜绝。对一般人而言最有效的学习方式是从感性的、活生生的事例中学习,比如自己的亲身经历或者他人的经验教训。而且,哪怕只是明白了一种特定的错误是如何可能发生的,就已经在将来避免该错误的路上迈了一大步。
本书并不打算教你如何用C语言编程(见Kemighan和Ritchie:The C ProgrammingLanguage,第2版,Prentice-Hall,1988),也不是一本C语言参考手册(见Harbison和Steele:C A Reference Manual,第2版,Prentice-Hall,1987)。本书未提及数据结构与算法(见VanWyk:Data Structures And C Programs,Addison-Wesley,1988),仅仅简略介绍了可移植性(见Horton:How To WrietPortable Programs In C,Prentice-Hall,1989)和操作系统接口(见Kemighan和Pike:The Unix Programming Environment,Prentice-Hall,1984)。本书中所涉及的问题均来自编程实践,适当作了简化(如果希望读到一些“挖空心思”设计出来,专门让你绞尽脑汁的C语言难题,见Feuer:The C Puzzle Book,Prentice-Hall,1982)。本书既不是一本字典也不是一本百科全书,我力图使其精简短小,以鼓励读者能够阅读全书。..
读者的参与和贡献
可以肯定,我遗漏了某些值得注意的问题。如果你发现了一个C语言问题而本书又未提及,请通过Addison-Wesley出版社与我联系。在本书的下一版中,我很有可能引用你的发现,并且向你致谢。
关于ANSIC
在我写作本书时,ANSIC标准尚未最后定案。严格地说,在ANSI委员会完成其工作之前,“ANSI C”的提法从技术上而言是不正确的。而实际上,ANSI标准化工作大体已经尘埃落定,本书中提及的有关ANSI C标准内容基本上不可能有所变动。很多C编译器甚至已经实现了大部分ANSI委员会所考虑的对C语言的许多重大改进。
毋需担心你使用的C编译器并不支持书中出现的ANSI标准函数语法,它并不会妨碍你理解例子中真正重要的内容,而且书中提及的程序员易犯错误其实与何种版本的C编译器并无太大关系。
致谢
本书中问题的收集整理工作绝非一人之力可以完成。以下诸位都向我指出过C语言中的特定问题,他们是Steve Bellovin(6.3节),Mark Brader(1.1节),Luca Cardelli(4.4节),Larry Cipriani(2.3节),Guy Harrisand Steve Johnson(2.2节),Phil Karn(2.2节),Dave Kristol(7.5节),George W.Leach(1.1节),Doug Mcllroy(2.3节),Barbara Moo(7.2节),Rob Pike(1.1节),Jim Reeds(3.6节),DennisRitchie(2.2节),Janet Sirkis(5.2节),Richard Stevens(2.5节),Biarne Stroustrup(2.3节),Ephraim Vishnaic(1.4节),以及一位自愿要求隐去姓名者(2.3节)。为简短起见,对于同一个问题此处仅仅列出了第一位向我指出该问题的人。我认为这些错误绝不是凭空臆造出来的,而且即使是,我想也没有人愿意承认。至少这些错误我本人几乎都犯过,而且有的还不止犯一次。
在书稿编辑方面许多有用的建议来自Steve Bellovin,Jim Coplien,MarcDonner,Jon Forrest,Brian Kemighan,Doug Mcllroy,Barbara Moo,Rob Murray,Bob Richton,Dennis Ritchie,Jonathan Shapiro,以及一些未透露姓名的审阅者。Lee McMahon与Ed Sitar为我指出了早期手稿中的许多录入错误,使我避免了一旦成书后将要遇到的很多尴尬。Dave Prosser为我指明了许多ANSIC中的细微之处。Brian Kerni Shan提供了极有价值的排版工具和帮助。
与Addison-Wesley出版社合作是一件愉快的事情,感谢Jim DeWolf,MaryDyer,Lorraine Ferrier,Katherine Harutunian,Marshall Henrichs,Debbie Lafferty,Keith Wollman,和Helen Wythe。当然,他们也从一些并不为我所知的人们那里得到了帮助,使本书最终得以出版,我在此也一并致谢。
这种情况对程序设计语言也是一样。任何一种程序设计语言,总存在一些语言特性,很可能会给还没有完全熟悉它们的人带来麻烦。令人吃惊的是,这些特性虽然因程序设计语言的不同而异,但对于特定的一种语言,几乎每个程序员都是在同样的一些特性上犯过错误、吃过苦头!因此,作者也就萌生了将这些程序员易犯错误的特性加以收集、整理的最初念头。
我第一次尝试收集这类问题是在1977年。当时,在华盛顿特区举行的一次SHARE(IBM大型机用户组)会议上,我作了一次题为“PL/I中的问题与‘陷阱”的发言。作此发言时,我刚从哥伦比亚大学调至AT&T的贝尔实验室,在哥伦比亚大学我们主要的开发语言是PL/I,而贝尔实验室中主要的开发语言却是C。在贝尔实验室工作的10年间,我积累了丰富的经验,深谙C程序员(也包括我本人)在开发时如果一知半解将会遇到多少麻烦。
1985年,我开始收集有关C语言的此类问题,并在年底将结果整理后作为一篇内部论文发表。这篇论文所引发的回应却大大出乎我的意料,共有2000多人向贝尔实验室的图书馆索取该论文的副本!我由此确信有必要将该论文的内容进一步扩充,于是就写成了现在读者所看到的这本书。
本书是什么
本书力图通过揭示一般程序员,甚至是经验老道的职业程序员,如何在编程中犯错误、摔跟头,以提倡和鼓励预防性的程序设计。这些错误实际上一旦被程序员真正认识和理解,并不难避免。因此,本书阐述的重点不是·般原则,而是一个个具体的例子。
如果你是一个程序员并且开发中真正用到C语言来解决复杂问题,这本书应该成为你的案头必备书籍。即使你已经是一个C语言的专家级程序员,仍然有必要拥有这本书,很多读过本书早期手稿的专业C程序员常常感叹:“就在上星期我还遇到这样一个Bug!”如果你正在教授C语言课程,本书毫无疑问应该成为你向学生推荐的首选补充阅读材料。
本书不是什么
本书不是对C语言的批评。程序员无论使用何种程序设计语言,都有可能遇到麻烦。本书浓缩了作者长达10年的C语言开发经验,集中阐述了C语言中各种问题和“陷阱”,目的是希望程序员读者能够从中吸取我本人以及我所见过的其他人所犯错误的经验教训。
本书不是一本“烹饪菜谱”。我们不能希望可以通过详尽的指导说明来完全避免错误。如果可行的话,那么所有的交通事故都可以通过在路旁刷上“小心驾驶”的标语来杜绝。对一般人而言最有效的学习方式是从感性的、活生生的事例中学习,比如自己的亲身经历或者他人的经验教训。而且,哪怕只是明白了一种特定的错误是如何可能发生的,就已经在将来避免该错误的路上迈了一大步。
本书并不打算教你如何用C语言编程(见Kemighan和Ritchie:The C ProgrammingLanguage,第2版,Prentice-Hall,1988),也不是一本C语言参考手册(见Harbison和Steele:C A Reference Manual,第2版,Prentice-Hall,1987)。本书未提及数据结构与算法(见VanWyk:Data Structures And C Programs,Addison-Wesley,1988),仅仅简略介绍了可移植性(见Horton:How To WrietPortable Programs In C,Prentice-Hall,1989)和操作系统接口(见Kemighan和Pike:The Unix Programming Environment,Prentice-Hall,1984)。本书中所涉及的问题均来自编程实践,适当作了简化(如果希望读到一些“挖空心思”设计出来,专门让你绞尽脑汁的C语言难题,见Feuer:The C Puzzle Book,Prentice-Hall,1982)。本书既不是一本字典也不是一本百科全书,我力图使其精简短小,以鼓励读者能够阅读全书。..
读者的参与和贡献
可以肯定,我遗漏了某些值得注意的问题。如果你发现了一个C语言问题而本书又未提及,请通过Addison-Wesley出版社与我联系。在本书的下一版中,我很有可能引用你的发现,并且向你致谢。
关于ANSIC
在我写作本书时,ANSIC标准尚未最后定案。严格地说,在ANSI委员会完成其工作之前,“ANSI C”的提法从技术上而言是不正确的。而实际上,ANSI标准化工作大体已经尘埃落定,本书中提及的有关ANSI C标准内容基本上不可能有所变动。很多C编译器甚至已经实现了大部分ANSI委员会所考虑的对C语言的许多重大改进。
毋需担心你使用的C编译器并不支持书中出现的ANSI标准函数语法,它并不会妨碍你理解例子中真正重要的内容,而且书中提及的程序员易犯错误其实与何种版本的C编译器并无太大关系。
致谢
本书中问题的收集整理工作绝非一人之力可以完成。以下诸位都向我指出过C语言中的特定问题,他们是Steve Bellovin(6.3节),Mark Brader(1.1节),Luca Cardelli(4.4节),Larry Cipriani(2.3节),Guy Harrisand Steve Johnson(2.2节),Phil Karn(2.2节),Dave Kristol(7.5节),George W.Leach(1.1节),Doug Mcllroy(2.3节),Barbara Moo(7.2节),Rob Pike(1.1节),Jim Reeds(3.6节),DennisRitchie(2.2节),Janet Sirkis(5.2节),Richard Stevens(2.5节),Biarne Stroustrup(2.3节),Ephraim Vishnaic(1.4节),以及一位自愿要求隐去姓名者(2.3节)。为简短起见,对于同一个问题此处仅仅列出了第一位向我指出该问题的人。我认为这些错误绝不是凭空臆造出来的,而且即使是,我想也没有人愿意承认。至少这些错误我本人几乎都犯过,而且有的还不止犯一次。
在书稿编辑方面许多有用的建议来自Steve Bellovin,Jim Coplien,MarcDonner,Jon Forrest,Brian Kemighan,Doug Mcllroy,Barbara Moo,Rob Murray,Bob Richton,Dennis Ritchie,Jonathan Shapiro,以及一些未透露姓名的审阅者。Lee McMahon与Ed Sitar为我指出了早期手稿中的许多录入错误,使我避免了一旦成书后将要遇到的很多尴尬。Dave Prosser为我指明了许多ANSIC中的细微之处。Brian Kerni Shan提供了极有价值的排版工具和帮助。
与Addison-Wesley出版社合作是一件愉快的事情,感谢Jim DeWolf,MaryDyer,Lorraine Ferrier,Katherine Harutunian,Marshall Henrichs,Debbie Lafferty,Keith Wollman,和Helen Wythe。当然,他们也从一些并不为我所知的人们那里得到了帮助,使本书最终得以出版,我在此也一并致谢。
序言回到顶部↑
我动笔写作《C缺陷与陷阱》时,可没想到14年后这本书仍然在印行!它之所以历久不衰,我想,可能是书中道出了C语言编程中一些重要的经验教训。就是到今天,这些教训也还没有广为人知。.
C语言中那些容易导致人犯错误的特性,往往也正是编程老手们为之吸引的特性。因此,大多数程序员在成长为C编程高手的道路上,犯过的错误真是惊人地相似!只要C语言还能继续感召新的程序员投身其中,这些错误就还会一犯再犯。
大家通常读到的程序设计书籍中,那些作者总是认为,要成为一个优秀的程序员,最重要的无非是学习一种特定程序语言、函数库或者操作系统的细节,而且多多益善。当然,这种观念不无道理,但也有偏颇之处。其实,掌握细节并不难,一本索引丰富完备的参考书就已经足矣;最多,可能还需要一位稍有经验的同事不时从旁点拨,指明方向。滩的是那些我们已经了解的东西,如何“运用之妙,存乎一心”。..
学习哪些是不应该做的,倒不失为一条领悟运用之道的路子。程序设计语言,就比如说C吧,其中那些让精于编程者觉得称心应手之处,也格外容易误用:而经验丰富的老手,甚至可以如有“先见之明”般,指出他们误用的方式。研究一种语言中程序员容易犯错之处,不但可以“前车之覆,后车之鉴”,还能使我们更暗熟这种语言的深层运作机制。
知悉本书中文版即出,将面对更为广大的中国读者,我尤为欣喜。如果您正在读这本书,我真挚地希望,它能对您有所裨益,为您释疑解惑,让您体会编程之乐。...
AndrewKoenig
美国新泽西州吉列
2002年10月
C语言中那些容易导致人犯错误的特性,往往也正是编程老手们为之吸引的特性。因此,大多数程序员在成长为C编程高手的道路上,犯过的错误真是惊人地相似!只要C语言还能继续感召新的程序员投身其中,这些错误就还会一犯再犯。
大家通常读到的程序设计书籍中,那些作者总是认为,要成为一个优秀的程序员,最重要的无非是学习一种特定程序语言、函数库或者操作系统的细节,而且多多益善。当然,这种观念不无道理,但也有偏颇之处。其实,掌握细节并不难,一本索引丰富完备的参考书就已经足矣;最多,可能还需要一位稍有经验的同事不时从旁点拨,指明方向。滩的是那些我们已经了解的东西,如何“运用之妙,存乎一心”。..
学习哪些是不应该做的,倒不失为一条领悟运用之道的路子。程序设计语言,就比如说C吧,其中那些让精于编程者觉得称心应手之处,也格外容易误用:而经验丰富的老手,甚至可以如有“先见之明”般,指出他们误用的方式。研究一种语言中程序员容易犯错之处,不但可以“前车之覆,后车之鉴”,还能使我们更暗熟这种语言的深层运作机制。
知悉本书中文版即出,将面对更为广大的中国读者,我尤为欣喜。如果您正在读这本书,我真挚地希望,它能对您有所裨益,为您释疑解惑,让您体会编程之乐。...
AndrewKoenig
美国新泽西州吉列
2002年10月
【插图】
相关资源回到顶部↑
· 【推荐】众多高校学子口口相传,他们共同的选择--华清远见嵌入式学院(嵌入式Linux就业课程、3G手机开发就业课程,通过入学测试即签100%就业协议,4个月集中实训,世界500强企业成功就业保障!!!)· 【亚嵌教育 嵌入式培训专家】(嵌入式培训,嵌入式Linux培训,ARM培训,Linux培训,3G培训,Android培训,WINCE培训,DSP培训,FPGA培训,嵌入式就业培训)
· 程序员的7种武器(正则表达式、编程语言、数据库、算法、软件调试、开发环境)
· C/C++ 经典著作(《C专家编程》《C++ Templates中文版》《C和指针 》《C陷阱与缺陷》《C++沉思录》)
评论交流
共有97人开贴评论 112人参与评论 85人参与打分 查看
评价等级:







发表于:2010-1-26 11:43:00
如果不知道Koenig在C和C++界的大名的话,那么只能说明你是一个非常初级的C/C++编程者,也许是刚刚进入C/C++的世界吧。
从国内角度,C++沉思录比本书出的早。而在国外本书是使Koenig扬名天下的大作,就内容来说C++沉思录不如本书艰深。
总体来说,本书不是介绍C语法,也不是介绍C初级编程技巧,本书内容偏向于程序设计语言学的角度讨论C语法中的某些命题,了解这些对C程序设计是大有裨益的。这本书是几本最深的C语言书之一,从前言来看,本书的内容源自于论文的总结。
对C程序员来说,本书是不可多得的学习大师的思想的机会。说难听点,我们C/C++程序员所以来的工具掌握在像Koenig这样的标准委员会成员手中,学习他们的著作无异于“了解圣意”,是最简单的提高自己的方法,比别人转述的要精准的多。
从国内角度,C++沉思录比本书出的早。而在国外本书是使Koenig扬名天下的大作,就内容来说C++沉思录不如本书艰深。
总体来说,本书不是介绍C语法,也不是介绍C初级编程技巧,本书内容偏向于程序设计语言学的角度讨论C语法中的某些命题,了解这些对C程序设计是大有裨益的。这本书是几本最深的C语言书之一,从前言来看,本书的内容源自于论文的总结。
对C程序员来说,本书是不可多得的学习大师的思想的机会。说难听点,我们C/C++程序员所以来的工具掌握在像Koenig这样的标准委员会成员手中,学习他们的著作无异于“了解圣意”,是最简单的提高自己的方法,比别人转述的要精准的多。
| 我要写评论 |
| 查看所有评论交流(共97条) |








点击看大图






加载中...

