你必须知道的495个C语言问题.pdf
你必须知道的495个C语言问题(关于C语言学习中遇到问题的解惑)版权声明Authorized translation from the English language edition, entitled: C Programming FAOsfrequently Asked Questions, 0201845199 by Steve Summit, published by Pearson Education, Inc.publishing as Addison-Wesley Professional. Copyright o 1996 by Addison-Wesley PublishingCompany, Inc.All rights reserved. No part of this book may be reproduced or transmitted in any form or by anymeans, electronic or mechanical, including photocopying, recording or by any information storageretrieval system, without permission from Pearson Education, IncCHINESE SIMPLIFIED language edition published by PEARSON EDUCATION ASIA LTD andPosts telecom Press Copyright C 2009本书中文简体字版由 Pearson education asia ltd授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。本书封面贴有 Pearson education(培生教育出版集团)激光防伪标签,无标签者不得销售。版权所有,侵权必究。Www.lopSage.com译者序在众多的计算机编程语言中,C语言无疑已经是个“老字辈”了。但自C语言发明以来的数十年时间的光阴流转并没有导致这门语言的式微。实际上,今天在计算机软件构建的诸多领域中,C语言依然挑着大梁。如果你是跟译者一样的日常使用C语言的从业者,相信你在C语言的学习和使用过程中,定会有很多问题。有的问题你可能通过自己的研究很快就找到了答案,而有的疑问则有可能困惑你很久。而且更让人沮丧的是,当你费尽九牛二虎之力,找到问题的答案以后,你可能会在不经意间发现有人在10年前就提出了同样的问题,而且得到了圆满的解答毕竞C语言的“年龄”已经不小了。这时你一定会想,如果有本书能把这些典型的问题和答案汇集起来该多好啊!那么,这本书正是你想要找的本书的原版基于因特网新闻组 comp.langc的FAQ列表。这个列表在作者 Steve Summit精心组织和管理之下,多年以来已经成了各种C语言问题的经典解答场所。译者第一次阅读这个FAQ以后便觉得茅塞顿开,随之产生了翻译它的愿望。本来是打算拿来作为企业内部培训资料使用的,但翻译完成之后感觉不宜专美,所以译者不顾文笔粗鄙、错漏百出而将中文版放到因特网上,希望能对相关人士有所帮助。忽一日,图灵公司的刘江先生跟我联系,了解我们是否愿意将这本书的中文版正式出版出来。欣然允诺后我才发现,要把一份因特网上的文档资料变成白纸黑字的书并不是那么简单。原版的书在内容上大约是发表在网上的FAQ的3倍之多,而且很多问题的阐述也比在线版本翔实、深入。译者几乎对整个稿件又从头翻译和整理了一遍。其间的辛苦,自不必与外人道也。虽然本着精益求精、锲而不舍的态度,无奈能力、精力有限,相信错漏之处在所难免。译者非常欢迎任何相关的批评、建议、指正。在在线版上,译者会维护一个中文版的勘误表。本书的原版在10多年前出版,但由于10年来C语言本身并没有什么显著的变化,加上原作者对其在线版本又在不断地修正和丰富,所以其生命力依然强大。译者在翻译的过程中,已经将原书的勘误、修正内容引入,同时某些问题还参考了在线版本上较新的答案,而且根据在线版增加了一些问题及解答,在书中用*标注。因此,从这个意义上讲,这是一本新书。孙云朱群英sunyun.s@gmail.comzhuqunying@gmail.com北京温哥华2008年9月2008年9月Www.lopSage.comoSAge. com原。版序1979年的某段时间,我听到很多人在谈论C这个当时还挺新的语言和那本刚刚推出的书。我买了一本 Brian Kernighan和 Denis Ritchie写的 The C Programming Language(也称K&R),但它在我的书架上空等了好一阵子,因为当时我并不急着需要它(况且我那时候还是一个余暇无多的大一新生)。后来证明这本书买得很幸运,因为当我最后拿起它以后,就再也没有放下了:从那以后,我就一直在用C语言编程1983年我结识了新闻组 net. lang c,这(以及它的后继者 comp langc)是一个绝佳的地方,你可以学习C语言的方方面面,发现别人关于C语言的各种疑问,认识到你可能根本还没有掌握关于C语言的一切。C语言尽管表面上很简单,但也还有一些并不显而易见的方面,有些问题不断有人问起。本书根据我从1990年5月开始在 comp. langc上发布的常见问题(FAQ)列表收集了这样的一些问题,并提供了答案。然而我得声明,这本书并不是对C语言的批评或诽谤。用户在使用时遇到困难,很容易迁怒于语言(或其他任何工具)或者要求正确设计的工具“应该”防止用户的误用。因此看到书中提及的各种误用以后,很容易将这样的书看作试图显示C语言的先天不足的长篇控诉。这实在是远悖我的本意。如果我不认为C语言是一门伟大的语言,或者没有在这种语言的编程中获得那么多的乐趣,那我永远也学不到足够的关于C语言的知识来写出本书,而且也不会试图写出本书来让别人更爱用C语言。我很喜欢C语言,我教C的课并花时间参与网上讨论的原因之一,就是希望发现这门语言(或者说编程本身)在哪些方面比较难学,让人不易高效地编程。本书展示了我认识到的部分内容,这些问题毫无疑问就是人们遇到麻烦最多的,而答案则经过多年的反复修正,就是为了消除人们的麻烦如果这些答案中有任何错误,那么读者一定会遇到麻烦。尽管审稿人和我都尽力去除所有的错误,但从一部手稿中根除最后一个错误,就跟从程序中去掉最后一个bug一样困难。通过出版社转交或发往我的Ema地址的任何修正和建议我都感激不尽。同时我也对任何错误的第一个发现者按惯例提供$1.00的报酬。如果你能够访问因特网,你可以在问题2047提到的t和ht网址中找到一份勘误表(和错误发现者的积分表)。希望我已经澄清,这本书并不是对C语言的批评,也不是对我学习过的C语言的书或其作者的批评。从K&R中我不仅学到了C语言,还学会了编程。在试图用自己的贡献来丰富C语言的文献的时候,我唯一遗憾的就是本书没有做到K&R第二版发现的妙处,即“C不是一门复杂的语言,www.iopsage.com2原版序并不值得为它写本厚书”。我希望那些深深地欣赏C语言(及K&R)的简洁和精确的人,看到本书反反复复讲述某些东西,或用3种稍稍不同的方式讲述一个问题的时候不要生气。尽管封面上只印着我一个人的名字,但这本书的背后却有许许多多的人,简直不知道该从哪里开始感谢。从某种意义上讲,comp.lang.c的每个读者(现在约有320000)都做出了贡献:这本书背后的AQ列表是为 comp. langc写的,因而本书也保留了 comp.lang c良好的讨论氛围。我希望这本书也保留了我开始阅读 net. lang.c时所学习的正确C语言编程的思想。因此,我要首先感谢我所知的一贯清楚解释这种思想的人: Doug gwyn、 Guy Harris、 Karl heuer、 HenrySpencer和 Chris torek。这些绅士们多年来不断耐心、慷慨而睿智地解答各种无穷尽的问题。是我出头写下这些常见问题的,但不要以为是我给出了这些答案。我曾经是个学生(我想正是Guy解答了我提出的问题,现为本书问题510),我对走在前面的大师们感激不尽。这本书与其说是我的,不如说是他们的。但对书中的不足和错误我愿一力承担。在线FAQ在变成本书的过程中增长了3倍,它的增长一度太快也变得有些笨拙了。 Mark braden、init Carpenter、 Stephen Clamage、 Jutta Degener、 Doug gw、 Karl Keer、 Joseph Kent和 Georgeeach阅读了部分或全部的手稿,帮我对这一过程施加了一些控制,感谢他们大量的仔细建议和修正。他们的努力都源自一个共同的愿望,期待在编程社区中提高对C语言的整体理解。感谢他们的贡献。这些审稿人中有3个长期以来也是在线FAQ的贡献者。感谢 Jutta Degener和 Karl heuer多年来的帮助,尤其感谢 Mark braden,从5年前我第一次在 comp. lang.c上发布FAQ以来,他就直给予我批评。我不知道他哪里来的毅力提出那么多的建议和修正,其中部分还遭到了我持久顽固的拒绝,即使(正如我最后意识到的)它们实际的确是改进。你可以感谢Mark为本书提供的很多解释的表述形式,而弄糟的部分就责怪我吧。还要感谢: Susan Cyr设计的封面; Bob dinse和 Eskimo north提供的网络环境,这对这样的项目至关重要; Bob holland提供的计算机,这本书的大部分内容都是用它写成的; Pete Keleher提供的 Alpha文本编辑器;华盛顿大学数学研究和工程图书馆提供的图书查询便利;华盛顿大学海洋学系借给我的磁带驱动器,用来访问我尘封的新闻组旧帖感谢 Tanmoy Bhattacharya提供的问题11的例子,感谢 Arjan Kenter提供的问题137中的代码,感谢 Tomohiko sakamoto提供的问题20.37中的代码,感谢 Roger Miller提供的问题1138中的一行文字。感谢世界各地的人们通过提供建议、修正、建设性的批评或其他支持对FAQ的贡献: JamshidAfshar. Lauri Alanko, Michael B. Allen, David Anderson, Jens Andreasen Tanner Andrews. SudheerApte, Joseph Arceneaux, Randall atkinson, Kaleb Axon, Daniel Barker, Rick Beem, Peter Bennett,Mathias Bergqvist, Wayne Berke, DanBernstein, Tanmoy Bhattacharya, John Bickers, Kevin Black,Gary Blaine, Yuan Bo, Mark J. Bobak, Anthony Borla, Dave Boutcher, Alan Bowler,breadbox@muppetlabs.com,MichaelBresnahan,WalterBriscoe,VincentBroman,RobertT.BrownStan Brown, John R. Buchan, Joe Buehler, Kimberley Burchett, Gordon Burditt, Scott Burkett,Eberhard Burr, Burkhard Burow, Conor P. Cahill, D'Arcy J M. Cain, Christopher Calabrese, Ian CargillWww.lopSage.com原版序3Vinit Carpenter, Paul Carter, Mike Chambers, Billy Chambless, C. Ron Charlton, Franklin Chen,Jonathan Chen, Raymond Chen, Richard Cheung, Avinash Chopde, Steve Clamage, Ken Corbin, DannCorbit, Ian Cottam, Russ Cox, Jonathan Coxhead, Lee Crawford, Nick Cropper, Steve Dahmer, JimDalsimer, Andrew Daviel, James Davies, John E. Davis, Ken Delong, Norm Diamond, Jamie Dickson,Bob Dinse, dynes@plenarysoftware, Colin Dooley, Jeff Dunlop, Ray Dunn, Stephen M. Dunn, AndrewDunstan, Michael J. Eager, Scott Ehrlich, Arno Eigenwillig, Yoav Eilat, Dave Eisen, Joe English, BjornEngsig, David Evans, Andreas Fassl, Clive D W. Feather, Dominic Feeley, Simao Ferraz, Pete Filandr,Bill Finke Jr. Chris Flatters. Rod Flores Alexander Forst Steve Fosdick Jeff francis, Ken Fuchs. TomGambill, Dave Gillespie, Samuel Goldstein, Willis Gooch, Tim Goodwin, Alasdair Grant, W. WesleyGroleau, Ron Guilmette, Craig Gullixson, Doug Gwyn, Michael Hafner, Zhonglin Han, DarrelHankerson, Tony Hansen, Douglas wilhelm Harder, Elliotte Rusty Harold, Joe Harrington, Guy HarrisJohn Hascall, Adrian Havill, Richard Heathfield, Des herriott, Ger Hobbelt, Sam Hobbs, JoelRayHolveck, Jos Horsmeier, Syed Zaeem Hosain, Blair Houghton, Phil Howard, Peter Hryczanek, James CHu, Chin Huang, Jason Hughes, David Hurt, Einar Indridason, Vladimir Ivanovic, Jon Jagger, Ke Jin,Kirk Johnson, David Jones, Larry Jones, Morris M. Keesan, Arjan Kenter, Bhaktha Keshavachar, JamesKew, Bill Kilgore, Darrell Kindred, Lawrence Kirby, Kin-ichi Kitano, Peter Klausler, John KleinjansAndrew Koenig, Thomas Koenig, Adam Kolawa, Jukka Korpela, Przemyslaw Kowalczyk, AjoyKrishnan T, Anders Kristensen, Jon Krom, Markus Kuhn, Deepak Kulkarni, Yohan Kun, B Kurtz, KazKylheku, Oliver Laumann, John Lauro, Felix Lee, Mike Lee, Timothy J. Lee, Tony Lee, Marty Leisner,Eric Lemings, Dave Lewis, Don Libes, Brian Liedtke, Philip Lijnzaad, James D. Lin, Keith Lindsay,Yen-Wei liu, Paul Long, Patrick J. LoPresti, Christopher Lott, Tim Love, Paul Lutus, Mike McCarty,Tim McDaniel. Michael MacFaden. Allen Mcintosh, Scott McKellar. Kevin McMahon, StuartMacMartin, John R. MacMillan, Robert S Maier, Andrew Main, Bob Makowski, Evan Manning, BarryMargolin, George Marsaglia, George Matas, Brad Mears, Wayme Mery, De Mickey, Rich Miller, RogerMiller, Bill Mitchell, Mark Moraes, Darren Morby, Bernhard Muenzer, David Murphy, Walter Murray,Ralf Muschall Ken Nakata, Todd Nathan Taed Nelson pedro Zorzenon neto, Daniel Nielsen LandonCurt noll. Tim Norman, Paul Nulsen, David O'Brien, Richard A. O'Keefe. Adam Kolawa, KeithEdward o'hara, James Ojaste, Max Okumoto, Hans Olsson, Thomas Otahal, Lloyd Parkes, Bob PeckHarry Pehkonen, Andrew Phillips, Christopher Phillips, Francois Pinard, Nick Pitfield, Wayne Pollock,Polver@aol.com,DanPop,DonPorges,ClaudioPotenza,LutzPrechelt,LynnPye,EdPrice,KevinDQuitt, Pat Rankin, Arjun Ray, Eric S Raymond, Christoph Regli, Peter W. Richards, James Robinson,Greg Roelofs, Eric Roode, Manfred Rosenboom,J M. Rosenstock, Rick Rowe, Michael RubensteinErkki Ruohtula, John C. Rush, John Rushford, Kadda Sahnine, Tomohiko Sakamoto, MatthewSaltzman, Rich Salz, Chip Salzenberg, Matthew Sams, Paul Sand, David W. Sanderson, Frank Sandy,Christopher Sawtell, Jonas Schlein, Paul Schlyter, Doug Schmidt, Rene Schmit, Russell Schulz, DeanSchulze, Jens Schweikhardt, Chris Sears, Peter Seebach, Gisbert W. Selke, Patricia Shanahan, girijaWww.lopSage.com4原版序Shanker, Clinton Sheppard, Aaron Sherman, Raymond Shwake, Nathan Sidwell, Thomas Siegel, Peterda Silva, Andrew Simmons, Joshua Simons, Ross Smith, Thad Smith, Henri Socha, Leslie J. SomosEric Sosman, Henry Spencer, David Spuler, Frederic Stark, James Stern, Zalman Stern, MichaelSternberg, Geoff Stevens, Alan Stokes, Bob Stout, Dan Stubbs, Tristan Styles, Richard Sullivan, SteveSullivan, Melanie Summit, Erik Talvola, Christopher Taylor, Dave Taylor, Clarke Thatcher, WayneThroop Chris Torek, Steve Traugott, Brian Trial, Nikos Triantafillis, Ilya Tsindlekht, Andrew Tucker,Goran Uddeborg, Rodrigo Vanegas, Jim Van Zandt, Momchil Velikov, Wietse Venema, Tom Verhoeff,Ed Vielmetti, Larry Virden, Chris Volpe, Mark Warren, Alan Watson, Kurt Watzka, Larry Weiss, MartinWeitzel, Howard West, Tom White, Freek Wiedijk,, Stephan Wilms, Tim Wilson, Dik T. Winter, LarsWirzenius, Dave Wolverton, Mitch Wright, Conway Yee, James Youngman, Ozan S. YigitNAZhuoZang。我试图记录下我采纳建议的每一个人,但我担心可能还是遗漏了一些,对那些名字本该出现在这里而没有出现的人,我诚恳地致以道歉。最后,我要感谢 Addison- Wesley的编辑 Debbie Lafferty,她有一天发邮件问我是否有兴趣写这本书。我有兴趣,你现在手里拿的就是它。我希望这本书能让你跟我一样觉得C语言编程令人快乐Steve Summitscs(@eskimo.com1995年7月于华盛顿州西雅图市①致谢名单根据最新资料整理。—编者注www.topSagecom你可能在酒吧或聚会上有这样的经历,有人跟你打赌让你做一些看似简单,但最后却限于人体特质或物理规律而根本无法完成的事情。跟你打赌的人知道,他挑战的人越多,他持续获胜的可能性就越大,因为这些特质或规律虽然十分隐晦,却是相当稳定、可以预测的。同样,如果你让很多人来完成一个复杂任务,如学习C语言,他们肯定会遇到同样的困难,提出同样的问题。在最初设计任务的时候这些困难和问题也许不能预见,而答案也恐怕是“后见之明”,但人们依然会不断遇到同样的困难,也会不断提出同样的问题。这些困难和问题并不表明任务就不能完成,只能说明它比较困难,从而变得很有趣。毫不奇怪,这些问题在因特网尤其是互动讨论的新闻组上不断被问起。将这些常见问题收集起来的想法是顺理成章的,顺着这一想法形成了常见问题(FAQ)列表的传统。FAQ列表未必总能达成最初设想的减少常见问题发生率的目的,但如果问题是一贯的,那它们被经常问到并纳入FAQ列表的事实说明,它们也许正是你或本书的其他读者要问的问题关于本书多数(关于C语言或其他任何主题的)书都是从作者的角度写成的。它们是用一种作者自己明白的方式来讨论作者认为你应该知道的主题。如果那种方式不适合你(在某种程度上,也不可能适合,因为作者预先已经知道那些内容,而你却全然不知),你很有可能被弄得满头雾水而这本书却不一样,它由400多个问题组织而成,所有问题都是人们在学习C语言编程的过程中提出的真实问题。本书不是针对作者认为重要的议题,而是针对真正的读者认为重要的议题,讨论他们提出的问题。如果你在学习或使用C语言,而你遇到的问题在别的书里都找不到答案,那么你很有可能会在这里找到答案本书不能保证解答你在C语言编程中遇到的所有问题,因为在编程实践中产生的很多问题都跟你的问题领域有关,而本书只涵盖了C语言本身。正如它不能涵盖每个人试图用C语言解决的每个问题的每个方面,本书也不能涵盖每个人用C语言编程时用的每个操作系统的方方面面或每个人希望用C语言实现的每个算法。具体的问题、具体的操作系统和通用的算法都有专门的书和其他材料进行讨论。不过,某些跟操作系统和算法相关的问题十分常见,因此第19章和第20章对其中一些问题提供了简单的、介绍性的答案,但不要期待它们很完备。本书中的问题是人们在读完一本C语言入门书或上了一门C语言课程之后常常会提到的。因此本书不是一点点教你学C语言,也不会讨论任何C语言教材都会讨论的基础问题。而且,本书Www.lopSage.com前言的答案在极大程度上都应该是绝对正确,不会传播任何误解的。因此有些答案初看起来显得有些过于详细,它们要向你提供完整的图景,而不能过于简化而略去了重要的细节。(毕竟,很多这类细节正是本书的问答中提到的诸多错误观点的根源。)在这些详尽的答案中,必要的地方会有捷径和简化处理,而在术语表中你会找到术语的精确定义,帮你准确解释很多问题。当然,这些捷径和简化处理都是安全的,它们不会导致以后的误解,而如果你需要完整的版本,你总是可以找到更详尽的解释或者查到相关的参考文献。正如我们会在第3章和第1章中看到的那样,C语言的标准定义并没有规定每个写成的C程序的行为。有些程序陷入了各种灰色地带:它们可能在某些系统上能运行,而且严格说来也不非法,但却不能确保在各处都能运行。本书介绍的是可移植的C编程,因此在答案中建议,只要可能就不用不可移植的方法。本书所基于的在线FAQ列表是一种对话的方式,当人们看不懂的时候,就会直言不讳地提出来。这样的及时反馈非常有利于改善解答的形式。尽管出成书以后就不能这么动态了,但这样的对话方式依然适用:欢迎你的意见、批评和建议。如果你能访问因特网,可以发送意见到scs@eskimo.com,或者寄信让出版社转交。本书的堪误表可以在因特网上获得,并在网上进行维护,具体参见问题20.47中的信息。问题格式本书的内容包含一系列的问题及答案。很多答案中还列举了参考书目;有些还有脚注,如果你觉得它们太吹毛求疵,可以略过。等宽字体用来表示C语法(函数和变量名、关键字等),也用来表示一些操作系统命令(如CC等)。偶尔出现的()这样的符号表示 UNIX Programmer's Manual第4章的“ty”一节。代码示例这是本关于C语言的书,因此必要处给出了许多C程序段。这些例子主要用来清楚地展示。它们不一定总是用最高效的方式写成的,让它们更“快”往往会导致更不清楚。(关于代码效率的信息参见问题2014。)它们通常都是用现代的ANSI风格的语法写成。如果你还在使用“经典的( classic)”编译器,参见问题1.31关于转换的提示。作者和出版社欢迎你在自己的程序中使用和修改这些代码片段,当然如果你能提及作者,我们将十分感激。(某些片段来自其他来源,也采用同样的策略。如果你使用这些代码,请感谢对应的贡献者)较大的例子的源码可以通过匿名印从 aw. com的 seng/authors/summit/faq下载(参见问题18.12)。为了强调某些要点,我不得不举一些不能那样做的反例子。在答案中,这样的代码片段都用/* WRONG*/这样明确的注释标示出来了,提示你不要模仿。(问题中的代码片段通常没有类似的标示,但从问题本身的提法上应该很容易看出代码片段有问题,因为这些问题通常是“为什么这样做不行”。)Www.lopSage.com
下载地址
用户评论