Thinking In C , Vol 1 - Gatech.edu

Transcription

Thinking in C ,Volume 1, 2nd EditionCompleted January 13, 2000Bruce Eckel, President,MindView, Inc.Planet PDF brings you the Portable DocumentFormat (PDF) version of Thinking in C Volume 1(2nd Edition). Planet PDF is the premier PDFrelated site on the web. There is news, software,white papers, interviews, product reviews, Weblinks, code samples, a forum, and regular articlesby many of the most prominent and respected PDFexperts in the world. Visit our sites for more com/Click here to buy the paper version

Winner, Software Development Magazine’s1996 Jolt Award for Best Book of the Year“This book is a tremendous achievement. You owe it to yourself tohave a copy on your shelf. The chapter on iostreams is the mostcomprehensive and understandable treatment of that subject I’veseen to date.”Al StevensContributing Editor, Doctor Dobbs Journal“Eckel’s book is the only one to so clearly explain how to rethinkprogram construction for object orientation. That the book is alsoan excellent tutorial on the ins and outs of C is an added bonus.”Andrew BinstockEditor, Unix Review“Bruce continues to amaze me with his insight into C , andThinking in C is his best collection of ideas yet. If you want clearanswers to difficult questions about C , buy this outstandingbook.”Gary EntsmingerAuthor, The Tao of Objects“Thinking in C patiently and methodically explores the issues ofwhen and how to use inlines, references, operator overloading,inheritance and dynamic objects, as well as advanced topics such asthe proper use of templates, exceptions and multiple inheritance.The entire effort is woven in a fabric that includes Eckel’s ownphilosophy of object and program design. A must for every C developer’s bookshelf, Thinking in C is the one C book youmust have if you’re doing serious development with C .”Richard Hale ShawContributing Editor, PC Magazine

Comments from Readers:Wonderful book Great stuff! Andrew Schulman, Doctor Dobbs JournalAn absolute, unqualified must. One of the most-used, most trusted books on myshelf.” TUG LinesThis is stuff a programmer can really use. IEEE ComputerA refreshing departure. PJ Plauger, Embedded Systems Programmingmagazine Eckel succeeds it’s so readable. Unix WorldShould definitely be your first buy. C GazetteA fantastic reference for C ! Michael Brandt, Senior Analyst/Programmer,Sydney, AustraliaOn our project at HRB Systems we call your book “The Answer Book”. It is ourC Bible for the project. Curt Snyder, HRB SystemsYour book is really great, and I can’t thank you enough for making it availablefor free on the web. It’s one of the most thorough and useful references for C I’ve seen. Russell Davis. the only book out there that even comes close to being actually readable whentrying to learn the ropes of C (and the basics of good object orientedprogramming in general). Gunther Schulz, KawaiiSoftI love the examples in your book. There’s stuff there that I never would havethought of (and some things that I didn’t know you could do)! Rich Herrick,Senior Associate Software Engineer, Lockheed-Martin Federal Systems,Owego, NYIt’s an amazing book. Any questions I have I refer to this online book. Helped inevery case. I’m simply happy to have access to a book of this caliber. Wes Kells,Comp Eng. Student, SLC Kingston.You are an invaluable resource and I greatly appreciate your books, email listetc. It seems every project I have worked on has been successful because of yourinsights. Justin VoshellThis is the book I have been looking for on C . Thomas A. Fink, ManagingDirector, Trepp, LLCYour books are authoritative yet easy to read. To my colleagues I call you theK&R of C . Mark Orlassino, Senior Design Engineer, HarmonIndustries, Inc., Hauppauge, NY

When I first started learning C , your book “Thinking in C ” was my shiningguide light in a dark tunnel. It has been my endeavor to improve my C skillswhenever possible, and to that effect, “Thinking in C ” has given me the strongfoundation for my continuous improvement. Peter Tran, Senior SystemsAnalyst (IM), Compaq Computer CorporationThis book is the best general reference in my on-going quest to master C . Mostbooks explain some topics thoroughly but are deficient in others. “Thinking inC ” 2/E does not pass the buck to another book. When I have questions it hasanswers. Thomas MichelI have a whole mountain of books and none of them make sense nor do theyexplain things properly. I have been dying for a good template and STL book.Then I decided to read your material and I was amazed. What you did was showhow to write C with templates and STL without bogging down with details.What you did was what I expected of the C community, the next generation ofC authors. As an author I AM IMPRESSED at your writing and explanationskills. You covered topics that nobody has properly covered before. Yourapproach is one from a person who has actually sat down and went through thematerial in detail. And then you questioned the sanity of the situation and whatwould be the problem areas. On my bookshelf, it will definitely be one of thenecessary books, right beside Petzold. Christian Gross, consultant/mentorcgross@eusoft.comI think your book is very, very, VERY good. I have compared it to others in thebookstore, and have found that your book actually teaches me basic C fundamentals while I learn the STL. a very nice experience to learn about bothat once, hand-in-hand. I think your book is laid out very well, and explainsthings in an easy-to-understand fashion. Jeff Meininger, Software Developer,boxybutgood.comYour book is the best by far of any I’ve seen. Please get it right so that we can allhave an excellent and “reliable” reference work! And please hurry! We aredesperate for a work of this quality! Steve Strickland, Live Minds (a Puzzlebusiness)(On Usenet) Unlike most other C authors, Eckel has made a career of teachingC and Java classes ONLY. He’s had the benefit of a GREAT deal of novicefeedback, and the books reflect that. His books are not just about writing inC /Java, but understanding the intent of the languages and the mindset thatgoes with thinking in them. Eckel’s also the best technical writer I’ve read sinceJeff Duntemann. Very clear and easy to read. Don’t be put off by the apparentlarge size of his books. Either can be read in *less* than 21 days. :-} RandyCrawford, MRJ Technology Solutions, Fairfax VA

Your work is greatly appreciated and I thank you for helping me understandboth C and Java better. Barry Wallin, Math/Computer Science Teacher,Rosemount High School, Rosemount, MNI would like to thank you for your book “Thinking in C ” which is, with nodoubt, the best book I ever read about this subject. Riccardo Tarli - SWEngineer - R&D TXT Ingegneria Informatica - ItalyI have been reading both of your books, Thinking In Java and Thinking In C .Each of these books is easily the best in its category. Ratnakarprasad H.Tiwari, Mumbai, India the “Debugging Hints” section is so valuable, I’m tempted to print it and keepit with me at all times. I think this section should be a mandatory part of anyintroductory class after the first one or two programming problems. FredBallard, Synectics Inc.Your book is really a treasure trove of C knowledge. I feel like you give a goodoverview and then explain the nuts and bolts. Raymond Pickles, AntennaSection, Radar Division, U.S. Naval Research Laboratory, WashingtonDCAs an Internal Medicine Specialist and Computer Scientist I spend a great deal oftime trying to extract information from books and journals. My experience is thata good author is one who makes difficult concepts accessible, a great one makesit look almost easy. On this score you are certainly one of my top three technicalwriters. Keep up the good work. Dr. Declan O’Kane, Leicester, EnglandFor my second-level C course, “Thinking in C ” is my constant referenceand companion, and I urge my students to consult it regularly. I refer to thechapter on Operator Overloading constantly. The examples/code alone areworth the cost of the book many times over. So many books and developmentenvironments are predicated on the assumption that the only application for aprogramming language is for a Windows environment; it’s great to find and usea book which concentrates on C so we can prepare our students for careers infields like embedded systems, networking, etc., which require real depth ofunderstanding. Robert Chase, Professor, Sweet Briar CollegeI think it’s a fantastic intro to C , especially for longtime dabblers like me – Ioften know “how,” but rarely “why,” and TIC2 is a godsend. Tony Likhite,System Administrator/DBA, Together NetworksAfter reading the first 80 pages of this book, I have a better understanding of oopthen I've gotten out of the ton of books I've accumulated on the subject. Thanks.Rick Schneewind

ThinkingInC Second EditionBruce EckelPresident, MindView Inc.Prentice HallUpper Saddle River, New Jersey 07458http://www.prenhall.com

Publisher: Alan AptProduction Editor: Scott DisannoExecutive Managing Editor: Vince O'BrienVice President and Editorial Director: Marcia HortonVice President of Production and Manufacturing: David W. RiccardiProject Manager: Ana TerryBook Design, Cover Design and Cover Line Art:Daniel Will-Harris, daniel@will-harris.comCover Watercolor: Bruce EckelCopy Editor: Stephanie EnglishProduction Coordinator: Lori BulwinEditorial Assistant: Toni HolmMarketing Managers: Jennie Burger, Bryan Gambrel 2000 by Bruce Eckel, MindView, Inc.Published by Prentice Hall Inc.Pearson Higher EducationUpper Saddle River, New Jersey 07632The information in this book is distributed on an “as is” basis, without warranty. Whileevery precaution has been taken in the preparation of this book, neither the author nor thepublisher shall have any liability to any person or entitle with respect to any liability, lossor damage caused or alleged to be caused directly or indirectly by instructions containedin this book or by the computer software or hardware products described herein.All rights reserved. No part of this book may be reproduced in any form or by anyelectronic or mechanical means including information storage and retrieval systemswithout permission in writing from the publisher or author, except by a reviewer whomay quote brief passages in a review. Any of the names used in the examples and text ofthis book are fictional; any relationship to persons living or dead or to fictional charactersin other works is purely coincidental.Printed in the United States of America10 9 8 7 6 5 4 3 2 1ISBN 0-13-979809-9Prentice-Hall International (UK) Limited, LondonPrentice-Hall of Australia Pty. Limited, SydneyPrentice-Hall Canada, Inc., TorontoPrentice-Hall Hispanoamericana, S.A., Mexico

Prentice-Hall of India Private Limited, New DelhiPrentice-Hall of Japan, Inc., TokyoPearson Education Asia Ltd., SingaporeEditora Prentice-Hall do Brasil, Ltda., Rio de Janeiro

PublicC SeminarsCheck www.BruceEckel.comfor in-depth details and the dateand location of the next:Hands-On C Seminar Based on this book Get a solid grounding in Standard C fundamentals Includes in-class programming exercises Personal attention during exercisesIntermediate C Seminar Based on Volume 2 of this book (downloadable atwww.BruceEckel.com) In-depth coverage of the Standard C Library Strings, containers, iterators, algorithms In-depth templates & exception handlingAdvanced C Topics Based on advanced topics in Volume 2 of this book Design patterns Building robust systems Creating testing & debugging frameworksSubscribe to the free newsletterto be automatically informedof upcoming seminarsAlso visit www.BrucEckel.com for:!"Consulting ServicesExercise solutions for this book!"

Seminars-on-CD-ROMIf you like theThinking in CSeminar-on-CD packaged withthis book, then you’ll also like:Bruce Eckel’sHands-On C SeminarMultimedia CD ROMIt’s like coming to the seminar!Available at www.BruceEckel.com Overhead slides and synchronized audio recorded by Bruce EckelAll the lectures from the Hands-On C SeminarBased on this bookGet a solid grounding in Standard C FundamentalsJust play it to see and hear the lectures!Lectures are indexed so you can rapidly locate the discussionof any subjectDetails and sample lecture can be found on the Web siteSee www.BruceEckel.comfor other Seminars-on-CD ROM The Intermediate C Seminar Advanced C Topics

DedicationTo my parents, my sister, and my brother

What’s inside.Preface1What’s new inthe second edition . 2What’s in Volume 2of this book . 3How to get Volume 2. 3Prerequisites . 4Learning C . 4Goals . 6Chapters. 7Exercises . 13Exercise solutions .13Source code . 13Languagestandards . 15Language support .16The book’sCD ROM . 16CD ROMs, seminars,and consulting. 17Errors. 17About the cover . 18Book design andproduction . 19Acknowledgements . 201: Introduction toObjects23The progress ofabstraction .25An object has aninterface.27The hiddenimplementation .30Reusing theimplementation .32Inheritance: reusingthe interface .34Is-a vs. is-like-arelationships . 38Interchangeableobjects withpolymorphism .40Creating anddestroying objects .45Exception handling:dealing with errors.46Analysisand design.48Phase 0: Make a plan . 51Phase 1: What arewe making? . 52Phase 2: How willwe build it? . 56Phase 3: Build the core . 61Phase 4: Iteratethe use cases . 62

Phase 5: Evolution .63Plans pay off .65Extremeprogramming . 66Write tests first.66Pair programming .68Why C succeeds . 70A better C .71You’re already onthe learning curve .71Efficiency .71Systems are easier toexpress and understand.72Maximal leveragewith libraries .73Source-code reusewith templates.73Error handling .73Programming in the large.74Strategies fortransition . 74Guidelines .75Management obstacles .77Summary . 792: Making & UsingObjects83The process oflanguagetranslation . 84Interpreters .85Compilers .86The compilation process.87Tools for separatecompilation . 89Declarations vs. definitions.90Linking .96Using libraries .97Your firstC program. 99Using the iostreams class.99Namespaces.100Fundamentals ofprogram structure.102"Hello, world!" .103Running the compiler .105More aboutiostreams . 105Character arrayconcatenation . 106Reading input. 107Calling other programs . 107Introducingstrings . 108Reading andwriting files. 110Introducingvector . 112Summary . 118Exercises. 1193: The C in C 121Creatingfunctions . 122Function return values. 125Using the Cfunction library. 126Creating your ownlibraries with the librarian . 127Controllingexecution . 128True and false . 128if-else . 128while. 130do-while . 131for . 131The break andcontinue keywords. 132switch . 134Using and misusing goto. 136Recursion . 137Introduction tooperators . 138Precedence . 138Auto incrementand decrement . 139Introduction todata types . 140Basic built-in types . 140bool, true, & false . 142Specifiers . 143Introduction to pointers. 145

Modifying theoutside object.149Introduction toC references .151Pointers and referencesas modifiers .153Scoping .155Defining variableson the fly .156Specifying storageallocation.159Global variables .159Local variables.161static.161extern .163Constants .165volatile .167Operators andtheir use.168Assignment .168Mathematical operators .169Relational operators .171Logical operators .171Bitwise operators .172Shift operators .173Unary operators.176The ternary operator .177The comma operator .178Common pitfallswhen using operators .179Casting operators.179C explicit casts .181sizeof – an operatorby itself .186The asm keyword.187Explicit operators .187Composite typecreation.188Aliasing nameswith typedef .188Combining variableswith struct .189Clarifying programswith enum.192Saving memorywith union.195Arrays .196Debugging hints .208Debugging flags.208Turning variables andexpressions into strings .211The C assert( ) macro.212Functionaddresses. 213Defining afunction pointer. 213Complicated declarations& definitions. 214Using a function pointer . 215Arrays of pointersto functions . 216Make: managingseparatecompilation. 217Make activities . 219Makefiles in this book. 222An example makefile. 223Summary . 226Exercises. 2264: Data Abstraction 233A tiny C-likelibrary . 235Dynamicstorage allocation . 239Bad guesses . 244What's wrong? . 246The basic object . 247What's an object? . 255Abstractdata typing . 256Object details. 257Header fileetiquette . 259Importance ofheader files. 260The multiple-declarationproblem . 262The preprocessor directives#define, #ifdef,and #endif. 263A standard for header files. 264Namespaces in headers. 265Using headers in projects . 266Nested structures . 266Global scope resolution . 271Summary . 271

Exercises .2725: Hiding theImplementation277Setting limits.278C accesscontrol .279protected .281Friends .281Nested friends .284Is it pure? .287Object layout .288The class .289Modifying Stash to useaccess control.292Modifying Stack to useaccess control.293Handle classes.294Hiding theimplementation .295Reducing recompilation.295Summary .298Exercises .2996: Initialization &Cleanup301Guaranteedinitialization with theconstructor .303Guaranteed cleanupwith thedestructor.305Elimination of thedefinition block .308for loops .310Storage allocation .311Stash withconstructors anddestructors .313Stack with constructors& destructors .316Aggregateinitialization . 320Defaultconstructors. 323Summary . 324Exercises. 3257: Function Overloading& DefaultArguments327More namedecoration . 329Overloading onreturn values . 331Type-safe linkage . 331Overloadingexample . 333unions. 336Defaultarguments. 340Placeholder arguments . 342Choosing overloadingvs. defaultarguments. 342Summary . 348Exercises. 3498: Constants353Value substitution . 354const in header files. 355Safety consts . 356Aggregates . 358Differences with C . 358Pointers. 360Pointer to const . 361const pointer. 362Assignment andtype checking. 363Function arguments &return values . 364Passing by const value . 365

Returning by const value .366Passing and returningaddresses .369Classes.373const in classes .374Compile-time constantsin classes .377const objects &member functions .380volatile .386Summary .388Exercises .3889: Inline Functions393Preprocessorpitfalls .394Macros and access .398Inline functions .399Inlines inside classes .400Access functions .401Stash & Stackwith inlines .408Inlines &the compiler.412Limitations .413Forward references .414Hidden activities inconstructors &destructors.415Reducing clutter .417More preprocessorfeatures.418Token pasting.419Improved errorchecking .420Summary .423Exercises .42410: Name Control427Static elementsfrom C.428static variablesinside functions .428Controlling linkage .434Other storageclass specifiers . 436Namespaces . 437Creating a namespace. 437Using a namespace. 440The use of namespaces . 445Static membersin C . 446Defining storage forstatic data members . 446Nested and local classes . 451static member functions . 452Static initializationdependency . 455What to do . 457Alternate linkagespecifications . 465Summary . 466Exercises. 46711: References & theCopy-Constructor473Pointers in C . 474Referencesin C . 475References in functions . 476Argument-passingguidelines . 479The copyconstructor . 479Passing & returningby value . 480Copy-construction. 487Default copy-constructor . 493Alternatives to copyconstruction. 496Pointersto members . 498Functions. 501Summary . 504Exercises. 505

12: OperatorOverloadingStash for pointers . 586511Warning &reassurance .512Syntax .513Overloadableoperators.515Unary operators.515Binary operators .520Arguments &return values.531Unusual operators.535Operators youcan’t overload.544Non-memberoperators.545Basic guidelines .547Overloadingassignment .548Behavior of operator .549Automatic typeconversion .561Constructor conversion .561Operator conversion .563Type conversion example.566Pitfalls in automatictype conversion .567Summary .570Exercises .57013: DynamicObject Creation575Object creation.577C’s approach to the heap .578operator new.580operator delete .581A simple example.581Memory manageroverhead .582Early examplesredesigned.583delete void* isprobably a bug .584Cleanup responsibilitywith pointers .585new & deletefor arrays . 592Making a pointermore like an array . 593Running outof storage. 594Overloadingnew & delete. 595Overloading globalnew & delete. 597Overloadingnew & delete for a class . 599Overloadingnew & delete for arrays . 603Constructor calls. 605placement new & delete . 607Summary . 609Exercises. 61014: Inheritance &Composition613Compositionsyntax. 614Inheritancesyntax. 616The constructorinitializer list . 618Member objectinitialization . 619Built-in types in theinitializer list . 620Combining composition& inheritance . 621Order of constructor &destructor calls. 623Name hiding . 625Functions thatdon’t automaticallyinherit . 630Inheritance and staticmember functions. 635

Choosing compositionvs. inheritance .635Subtyping .637private inheritance .640protected.641protected inheritance.643Operator overloading& evelopment .645Upcasting .647Why “upcasting?”.648Upcasting and thecopy-constructor.649Composition vs.inheritance (revisited) .652Pointer & referenceupcasting .653A crisis .654Summary .654Exercises .65515: Polymorphism &Virtual Functions659Evolution of C programmers .660Upcasting .662The problem .663Function call binding.663virtual functions .664Extensibility .666How C implementslate binding.669Storing type information .670Picturing virtual functions.672Under the hood.674Installing the vpointer .676Objects are different .676Why virtualfunctions? .677Abstract base classesand pure virtualfunctions . 679Pure virtual definitions . 684Inheritance andthe VTABLE. 685Object slicing . 688Overloading &overriding. 691Variant return type . 693virtual functions &constructors. 695Order of constructor calls . 696Behavior of virtual functionsinside constructors. 697Destructors andvirtual destructors . 699Pure virtual destructors . 701Virtuals in destructors . 704Creating anobject-based hierarchy. 705Operatoroverloading. 709Downcasting . 712Summary . 716Exercises. 71716: Introduction toTemplates723Containers . 724The need for containers. 726Overviewof templates . 727The template solution. 730Template syntax . 732Non-inlinefunction definitions . 734IntStack as a template . 735Constants in templates. 738Stack and Stashas templates . 739Templatized pointer Stash . 742Turning ownership

on and off .748Holding objectsby value .751Introducingiterators .754Stack with iterators .764PStash with iterators .768Why iterators?.774Function templates.778Summary .779Exercises .780A: Coding Style785B: ProgrammingGuidelines797C: RecommendedReading815C .816General C .816My own list of books.817Depth &dark corners .818Analysis & design.819Index823

PrefaceLike any human language, C provides a way toexpress concepts. If successful, this medium ofexpression will be significantly easier and more flexiblethan the alternatives as problems grow larger and morecomplex.

You can’t just look at C as a collection of features; some of thefeatures make no sense in isolation. You can only use the sum ofthe parts if you are thinking about design, not simply coding. Andto understand C this way, you must understand the problemswith C and with programming in general. This book discussesprogramming problems, why they are problems, and the approachC has taken to solve such problems. Thus, the set of features Iexplain in each chapter will be based on the way that I see aparticular type of problem being solved with the language. In thisway I hope to move you, a little at a time, from understanding C tothe point where the C mindset becomes your native tongue.Throughout, I’ll be taking the attitude that you want to build amodel in your head that allows you to understand the language allthe way down to the bare metal; if you encounter a puzzle, you’llbe able to feed it to your model and deduce the answer. I will try toconvey to you the insights that have rearranged my brain to makeme start “thinking in C .”What’s new in the second editionThis book is a thorough rewrite of the first edition to reflect all ofthe changes introduced in C by the finalization of the C Standard, and also to reflect what I’ve learned since writing thefirst edition. The entire text present in the first edition has beenexamined and rewritten, sometimes removing old examples, oftenchanging existing examples and adding new ones, and addingmany new exercises. Significant rearrangement and re-ordering ofthe material took place to reflect the availability of better tools andmy improved understanding of how people learn C . A newchapter was added which is a rapid introduction to the C conceptsand basic C features for those who don’t have the C backgroundto tackle the rest of the book. The CD ROM bound into the back ofthe book contains a seminar that is an even gentler introduction tothe C c

Planet PDF brings you the Portable Document Format (PDF) version of Thinking in C Volume 1 (2nd Edition). Planet PDF is the premier PDF-related site on the web. There is news, software, . I have been reading both of your books, Thinking In Java and Thinking In C . Each of these books is easily the best in its category. Ratnakarprasad H .