When the terrian disagrees with the map 当实际地形与地图标定不符时
trust the terrian. 相信地形 1
——Swiss army proverb 瑞士军队格言
This chapter is a grab bag of information; it aims to give you an idea of what to expect from the rest of the book.
这一章是个信息大杂烩,是为了让你了解本书的全貌。
Please skim through it and read what you find interesting.
你可以快速略读并找到你感兴趣的地方仔细阅读。
A teacher will find most parts immediately useful.
老师可以快速找到重点内容。
If you are reading this book without the benefit of a good teacher, please don’t try to read and understand everything in this chapter; just look at “The structure of this book” and the first part of the “A philosophy of teaching and learning” sections.
如果你没有老师的辅助,那么不要试图去读和理解这章的全部内容;只需要看「本书结构」和「教学和学习的哲学的第一部分」。
You may want to return and reread this chapter once you feel comfortable writing and executing small programs.
等到你能轻松地编写并执行一些小程序之后可以再回来重读本章。
This book consists of four parts and a collection of appendices:
本书分成4个部分和一系列附录:
vector
, list
, and map
) are implemented (using pointers, arrays, dynamic memory, exceptions, and templates) and used. It also demonstrates* the design and use of standard library algorithms (such as sort
, find
, and inner_product
).vector
,list
和map
)是怎样通过各种方式(指针,数组,动态内存,exceptions和模板)实现的。还阐明了标准库算法的设计与使用方法(比如sort
,find
和inner_product
)Unfortunately, the world of programming doesn’t really fall into four cleanly separated parts
然而,真实的编程并不是能清晰地分出几个独立的部分的。
Therefore, the “parts” of this book provide only a coarse classification of topics.
所以本书只是提供一个粗略的分类。
We consider it a useful classification (obviously, or we wouldn’t have used it), but reality has a way of escaping neat classifications.
我们想要好好分类,但很显然,复杂的现实情况总会有一种方式不符合分类。
For example, we need to use input operations far sooner than we can give a thorough explanation of C++ standard I/O streams (input/output streams).
比如,我们需要在详细介绍C++的I/O流之前就要用到一些输入操作。
Where the set of topics needed to present an idea conflicts with the overall classification, we explain the minimum needed for a good presentation, rather than just referring to the complete explanation elsewhere.
当有类似这种需求与严格遵守分类相互矛盾的情况出现时,我们会先满足最小的使用需求而介绍一点点儿,而非等到后面再给出完整的解释。
Rigid classifications work much better for manuals than for tutorials.
粗略的分类比起手册式的按部就班,更适合作为教程。
The order of topics is determined by programming techniques, rather than programming language features; see §0.2. For a presentation organized around language features, see Appendix A.
章节内容安排是基于编程方法,而非语言特性(0.2节);如果想看与特性,请看附录A。
To ease review and to help you if you miss a key point during a first reading where you have yet to discover which kind of information is crucial, we place three kinds of “alert markers” in the margin:
为了当你忘记一个重点可以方便回来查询,我会在页边使用三种「警告标识」:
In this book, we address* you directly. That is simpler and clearer than the conventional “professional” indirect form of address, as found in most scientific papers.
在本书中,我们会直接给你讲解内容,这样会比传统的,「专业」的,间接的,常见于学术论文中的讲解方式更加简洁明了。
By “you” we mean “you, the reader,” and by “we” we refer either to “ourselves, the author and teachers,” or to you and us working together through a problem, as we might have done had we been in the same room.
我说的「给你讲解」的「你」是指「正在读书的你」,而「我们」,要么是指「作为作者的我和老师」,要么是指「共同解决问题的你我」。
This book is designed to be read chapter by chapter from the beginning to the end.
这本书被设计成从头到尾一章一章地读。
Often, you’ll want to go back to look at something a second or a third time.
有时候,你可能会前后翻翻去回看一些内容。
In fact, that’s the only sensible approach, as you’ll always dash past some details that you don’t yet see the point in. In such cases, you’ll eventually go back again.
事实上,这才符合现实情况,你经常会读得很快,错过一些细节。这时你总要往回翻书。
However, despite the index and the cross-references, this is not a book that you can open to any page and start reading with any expectation of success.
但除了索引和交叉引用那几页,这并不是那种你随便翻到哪页都可以开始的书。
Each section and each chapter assume understanding of what came before.
每个部分,每一章节都是和之前内容环环相扣的。
Each chapter is a reasonably self-contained unit, meant to be read in “one sitting” (logically, if not always feasible on a student’s tight schedule). That’s one major criterion for separating the text into chapters.
每一章节在逻辑上都是一个完善的单元,应该「坐下来一口气读完」(当然了,如果日程安排比较紧张,做到这点可能比较难)。这是把正文分成章节的一种标准。
Other criteria include that a chapter is a suitable unit for drills and exercises and that each chapter presents some specific concept, idea, or technique.
另一种标准则是每个章节介绍特定的概念,思想和方法,配合练习题组成一个供学生深入研究的单元。
This plurality of criteria has left a few chapters uncomfortably long, so please don’t take “in one sitting” too literally.
这种标准会导致几个章节内容过于繁多,所以不要「一口气读完」。
In particular, once you have thought about the review questions, done the drill, and worked on a few exercises, you’ll often find that you have to go back to reread a few sections and that several days have gone by.
还有一种情况,当你做到复习题,思考题和编程练习时,你总会发现要回顾一下几天之前读到的上一个部分的内容。
We have clustered the chapters into “parts” focused on a major topic, such as input/output. These parts make good units of review.
对于这种情况,我们把同一类的各个章节放在一起组成一个主题,比如输入/输出,这样方便你做复习。
Common praise for a textbook is “It answered all my questions just as I thought of them!” That’s an ideal for minor technical questions, and early readers have observed the phenomenon with this book. However, that cannot be the whole ideal.
人们总是会夸一本书「啊对对对!我就是这么想的,我想得和答案一样」。这对次要的技术问题是一个理想的状态,初学者在读这本书或多或少都有此现象。但这并不是完全理想的。
We raise questions that a novice would probably not think of. We aim to ask and answer questions that you need to consider when writing quality software for the use of others.
我们会提出初学者可能很难想出来的问题。我们意在让学生必须意识到要做出对他人有用的高质量软件,才能回答我们提出的问题。
Learning to ask the right (often hard) questions is an essential part of learning to think as a programmer. Asking only the easy and obvious questions would make you feel good, but it wouldn’t help make you a programmer.
学会去问正确的(往往也是困难)的问题是学会像程序员一样思考的本质。只问一些简单明显的问题可能会让学生觉得舒服,但无助于学生成为好程序员。
We try to respect your intelligence and to be considerate about your time.
我们会尽力去照顾你的智商并考虑你拥有多少时间。
In our presentation, we aim for professionalism rather than cuteness, and we’d rather understate a point than hype it.
我们的表达会做到专业而非戏言,对重点的讲解也追求通俗易懂而非拔高晦涩。
We try not to exaggerate the importance of a programming technique or a language feature, but please don’t underestimate a simple statement like “This is often useful.”
我们不会过分夸大一种编程方法和语言特性的重要性,但你也不要过分低估被评价为「这玩意儿很有用」的简单语句。
If we quietly emphasize that something is important, we mean that you’ll sooner or later waste days if you don’t master it
如果我们强调一些东西很重要,我们的意思是如果你不能掌握它,你将会卡住好几天。
Our use of humor is more limited than we would have preferred, but experience shows that people’s ideas of what is funny differ dramatically and that a failed attempt at humor can be confusing.
尽管我们想把书写得幽默,但我会控制抖机灵的次数,因为经验告诉我,如果玩笑开得好,学生印象会很深刻,但一旦拉了,学生会很困惑。
We do not pretend that our ideas or the tools offered are perfect.
我们不会撒谎我们传授的思想和方法是完美无误的。
No tool, library, language, or technique is “the solution” to all of the many challenges facing a programmer. At best, it can help you to develop and express your solution.
反之,没有任何一种工具,库,语言和技术可以完美适合解决程序员遇到的各种难题。它们只能帮助你改进和表达出你的解法。
We try hard to avoid “white lies”; that is, we refrain from oversimplified explanations that are clear and easy to understand, but not true in the context of real languages and real problems.
我们也避免撒善意的谎言;也就是说,我们不会对清楚明了的简单概念进行过度的二次解释,因为过于简化根本不适用于真实的语言和问题的复杂度。
On the other hand, this book is not a reference; for more precise and complete descriptions of C++, see Bjarne Stroustrup, The C++ Programming Language, Fourth Edition (Addison-Wesley, 2013), and the ISO C++ standard.
这本书并不是一本参考手册,如果你需要更精确和完整的C++描述,请看我的另一本书:Bjarne Stroustrup, The C++ Programming Language, Fourth Edition (Addison-Wesley, 2013) 和 ISO的C++标准。
Programming is not just an intellectual activity, so writing programs is necessary to master programming skills. We provide two levels of programming practice:
编程并不只是智力活动,还需付出体力进行大量的编程练习,我们提供两个水平编程练习:
In addition, we recommend that you (every student) take part in a small project (and more if time allows for it).
除了练习之外 ,我们还推荐每个学生都要做一个小项目(如果时间允许,尽量扩大项目的规模)。
A project is intended to produce a complete useful program. Ideally, a project is done by a small group of people (e.g., three people) working together for about a month while working through the chapters in Part III.
一个项目的目标是产出有用的程序。最理想的是,开始学第三部分之后,一个项目一群人合作(最好3个人)以一个月为期限。
Most people find the projects the most fun and what ties everything together.
大部分人都会发现项目很有趣。
Some people like to put the book aside and try some examples before reading to the end of a chapter; others prefer to read ahead to the end before trying to get code to run.
一些人习惯不看书直接上手尝试;而一些人喜欢先把书读完在去动手编码。
To support readers with the former preference, we provide simple suggestions for practical work labeled “Try this” at natural breaks in the text.
对于前者,我们在文中某处会提供一些标记为「Try this」的小实践。
A Try this is generally in the nature of a drill focused narrowly on the topic that precedes it.
Try this实际上就是一种drill,不过只限于将要讲的主题。
If you pass a Try this without trying — maybe because you are not near a computer or you find the text riveting — do return to it when you do the chapter drill; a Try this either complements the chapter drill or is a part of it.
如果你跳过了Try this——也许当时你没在电脑前——那么当你读完本章时,你要把它当作drill做完。
At the end of each chapter you’ll find a set of review questions. They are intended to point you to the key ideas explained in the chapter
在每章章末都有一些复习题。它们帮助你回顾本章的重点概念。
One way to look at the review questions is as a complement to the exercises: the exercises focus on
the practical aspects of programming, whereas the review questions try to help you articulate the ideas and concepts. In that, they resemble good interview questions.
可以把复习题看做是exercise的补充:exercise着重于编程的实践,而复习题着重于巩固概念和思想。它们放在一起就是很好的面试题。
The “Terms” section at the end of each chapter presents the basic vocabulary of programming and of C++. If you want to understand what people say about programming topics and to articulate your own ideas, you should know what each means.
每章的「术语」提供了C++编程的一些基本词汇。如果你想要知道别人在说什么,你需要掌握这些词汇的含义。
Learning involves repetition. Our ideal is to make every important point at least twice and to reinforce it with exercises
学习需要重复。我们每个重点都会重复两遍,并且通过练习来巩固。
At the end of this book, will you be an expert at programming and at C++? Of course not!
读完这本书,你能成为C++专家么?当然不能!
When done well, programming is a subtle, deep, and highly skilled art building on a variety of technical skills. You should no more expect to be an expert at programming in four months than you should expect to be an expert in biology, in math, in a natural language (such as Chinese, English, or Danish), or at playing the violin in four months — or in half a year, or a year
编程是一项精密,深奥,需要很高构建的水平,需要很多技术的一项工作。你不能指望在四个月内学会编程,就像你不能在四个月里学会生物,数学,一门语言或者小提琴那样,半年不行,甚至一年都不行。
What you should hope for, and what you can expect if you approach this book seriously, is to have a really good start that allows you to write relatively simple useful programs, to be able to read more complex programs, and to have a good conceptual and practical background for further work.
但不要觉得灰心,好好跟着这本书学,对你的编程事业是一个好的开始,起初可能你只会写一些简单的实用程序,但慢慢你可以读更复杂的程序,这本书将为你未来的工作打下理论和实践的基础。
The best follow-up to this initial course is to work on a real project developing code to be used by someone else.
这门课最好的后续就是参与一个实际项目的开发。
After that, or (even better) in parallel with a real project, read either a professional-level general textbook (such as Stroustrup, The C++ Programming Language), a more specialized book relating to the needs of your project (such as Qt for GUI, or ACE for distributed programming), or a textbook
focusing on a particular aspect of C++ (such as Koenig and Moo, Accelerated C++; Sutter’s Exceptional C++; or Gamma et al., Design Patterns).
开发项目的同时,你可以读一些专业水平的教材,比如Stroustrup, The C++ Programming Language,或者根据你的项目的专题书籍(比如讲Qt GUI的,讲ACE分布式编程),或者特定主题的教材,比如Koenig and Moo, Accelerated C++,Sutter’s Exceptional C++,Gamma et al., Design Patterns。
For more references, see §0.6 or the Bibliography section at the back of the book.
更多书籍,请看0.6节。
Eventually, you should learn another programming language. Eventually, you should learn another programming language. We don’t con-
sider it possible to be a professional in the realm of software — even if you are not
primarily a programmer — without knowing more than one language
还有就是要学一门其他语言。我们不认为之掌握一门语言就可以胜任软件开发的工作,哪怕你不是编程岗位。
What are we trying to help you learn? And how are we approaching the process of teaching? We try to present the minimal concepts, techniques, and tools for you to do effective practical programs, including
我们怎么帮你学习C++?我们采取怎样的教学方式?我们尽量保证概念,技术,工具的精简以便于让你高效编程。
Working our way through these topics, we cover the programming techniques called procedural programming (as with the C programming language), data abstraction, object-oriented programming, and generic programming
贯穿这些主题,我们始终采用以下几种编程方法:过程化编程(C语言),数据抽象,面向对象编程,泛型编程。
The main topic of this book is programming, that is, the ideals, techniques, and tools of expressing ideas in code
这本书的主题是编程——即讲解通过代码表达想法的相关思想,方法和工具。
The C++ programming language is our main tool, so we describe many of C++’s facilities in some detail. But please remember that C++ is just a tool, rather than the main topic of this book. This is “programming using C++,” not “C++ with a bit of programming theory.”
C++编程语言是我们的主要工具,所以我们会详细讲解C++相关知识。但请记住C++只是个工具,但本书的主题是编程。是「用C++学习编程」,而不是「学习C++,捎带着学点儿编程知识」。
Each topic we address serves at least two purposes: it presents a technique, concept, or principle and also a practical language or library feature.
我们讲到的每个主题都有两个目标:它既代表方法,概念或者原理,也代表语言中的一个实际语法或库中的一个特性。
For example, we use the interface to a two-dimensional graphics system to illustrate the use of classes and inheritance. This allows us to be economical with space (and your time) and also to emphasize that programming is more than simply slinging code together to get a result as quickly as possible
例如,我们通过二维图形系统接口来讲解类和继承。这节省了我们的文本量和你的时间成本,并且强调了编程并不是把零碎的代码拼接到一起就能快速运行了。
The C++ standard library is a major source of such “double duty” examples — many even do triple duty.
C++标准库中有很多具有类似前文这种「双重指责」的实力——甚至有些具有「多重指责」。
For example, we introduce the standard library vector
, use it to illustrate widely useful design
techniques, and show many of the programming techniques used to implement it.
比如,我们会讲到标准库向量,借助它来讲解设计方法,并且会讲解很多实现了标准库 vector
的编程技术。
One of our aims is to show you how major library facilities are implemented and how they map to hardware. We insist that craftsmen must understand their tools, not just consider them “magical.”
我们的一个主要目标是向你展示一些库功能是如何实现的,又是怎么映射到硬件的,我们坚信工匠必须要理解它们的工具,而不是把它们视作「魔法」。
Some topics will be of greater interest to some programmers than to others. However, we encourage you not to prejudge your needs (how would you know what you’ll need in the future?) and at least look at every chapter. If you read this book as part of a course, your teacher will guide your selection.
不同读者对同一个主题的感受是不同的。但我们不推荐你按需读书,也就是觉得有些东西用不上不学了然后只读你感兴趣的部分,你怎么知道某个东西用不上呢?如果你是跟着一门课来看这本书,那你们的老师应该会告诉你看哪个部分。
We characterize our approach as “depth-first.” It is also “concrete-first” and “concept-based.”
我们是「深度优先」,也可以叫「具体优先」或「基于概念」。
First, we quickly (well, relatively quickly, Chapters 1–11) assemble a set of skills needed for writing small practical programs. In doing so, we present a lot of tools and techniques in minimal detail.
首先我们会快速讲(相对快速,1-11章)一些能让你马上上手写简单程序的技能。所以,不会涉及过多的细节。
We focus on simple concrete code examples because people grasp the concrete faster than the abstract. That’s simply the way most humans learn.
我们先从具体的代码示例入手,因为人们相比于抽象,更容易接受具体例子。这是人类学习的最简单途径。
At this initial stage, you should not expect to understand every little detail. In particular, you’ll find that trying something slightly different from what just worked can have “mysterious” effects.
在这个阶段,不要妄图理解所有细节。大胆尝试与之前不同的方法可能会给你的代码带来「神秘」的效果。
Do try, though! And please do the drills and exercises we provide. Just remember that early on you just don’t have the concepts and skills to accurately estimate what’s simple and what’s complicated; expect surprises and learn from them.
要敢于尝试!好好做练习题。起初你可能因为知识和概念的缺乏无法估计什么是难的,什么是简单的,
索性就按部就班,踏踏实实。
We move fast in this initial phase — we want to get you to the point where you can write interesting programs as fast as possible. Someone will argue, “We must move slowly and carefully; we must walk before we can run!”
这个入门阶段我们会进行得很快,因为我们想快速上手编程。一些人可能会说,「没学会走就想跑?」
But have you ever watched a baby learning to walk? Babies really do run by themselves before they
learn the finer skills of slow, controlled walking. Similarly, you will dash ahead, occasionally stumbling, to get a feel of programming before slowing down to gain the necessary finer control and understanding. You must run before you can walk!
可是你看见过小孩刻意地学走路么?小孩都是先会跑,然后才会慢慢地,稳稳地走路。学这本书也是一样,你会先快速学会编一些东西,然后在某个地方卡住,接着才去注意一些语言细节,学习一些编程方法,从而编出好的代码。你必须在学会走之前就会跑!
It is essential that you don’t get stuck in an attempt to learn “everything” about some language detail or technique
还有一点需要强调,不要试图把握所有语言细节和方法!
For example, you could memorize all of C++’s built-in types and all the rules for their use. Of course you could, and doing so might make you feel knowledgeable
比如,你可能会记住所有C++内置类型。当然这个比较好记,这可能会让你有种「学会了」的错觉。
However, it would not make you a programmer. Skipping details will get you “burned” occasionally for lack of knowledge, but it is the fastest way to gain the perspective needed to write good programs.
但这并不能让你成为程序员。跳过细节可能会让你捉襟见肘,但这是获得编程思维的最快的方法。
Note that our approach is essentially the one used by children learning their native language and also the most effective approach used to teach foreign languages.
我们的方法是类似于教小孩子学母语或者教一个人高效学外语的方法的。
We encourage you to seek help from teachers, friends, colleagues, instructors, Mentors, etc. on the inevitable occasions when you are stuck. Be assured that nothing in these early chapters is fundamentally difficult. However, much will be unfamiliar and might therefore feel difficult at first.
我们强烈建议你去寻求帮助,向谁都可以,老师,朋友,同事,助教…请放心,最开始这几章没有什么特别难的地方,只是有些东西太过于陌生,以至于看起来很难。
Later, we build on the initial skills to broaden your base of knowledge and skills. We use examples and exercises to solidify your understanding, and to provide a conceptual base for programming.
后面,我们会帮助你拓展知识和技能,构建基本能力。我们会用例子去巩固你的理解,建立好编程基础。
We place a heavy emphasis on ideals and reasons. You need ideals to guide you when you look for practical solutions — to know when a solution is good and principled.
我们把思想和理由都拿出来重点强调。你需要这些思想来指导你求解问题的过程,来判断一个解法是否是好的,符合逻辑的。
You need to understand the reasons behind those ideals to understand why they should be your ideals, why aiming for them will help you and the users of your code.
你需要理解这些思想背后是什么理由让你应该重视它们,为什么他们能给你用户和你的代码带来帮助。
Nobody should be satisfied with “because that’s the way it is” as an explanation. More importantly, an understanding of ideals and reasons allows you to generalize from what you know to new situations and to combine ideas and tools in novel ways to address new problems.
没人喜欢「由此可见」「由此易得」「显然可推出」这样的解释。理解思想最大的好处就是你具备了一种泛化的能力,能看透新的问题的本质和与之前解决过问题的共性,让你可以很快的以简洁的方式利用好点子和工具解决问题。
Knowing “why” is an essential part of acquiring programming skills. Conversely, just memorizing lots of poorly understood rules and language facilities is limiting, a source of errors, and a massive waste of time. We consider your time precious and try not to waste it.
知其所以然在编程中是非常重要的技能。反之,如果只是机械地记忆大量的规则和语言特性是非常受限的,会导致很多错误,还会浪费大量的时间。我们认为你的是件很珍贵,不该被浪费。
Many C++ language-technical details are banished to appendices and manuals, where you can look them up when needed.
诸如C++的语言细节这一大坨东西,我们都扔到附录和手册里,你可以到那里去查。
We assume that you have the initiative to search out information when needed. Use the index and the table of contents.
我们假设你能主动去查你需要的信息。索引和目录都能帮到你。
Don’t forget the online help facilities of your compiler, and the web. Remember, though, to consider every web resource highly suspect until you have reason to believe better of it. Many an authoritative-looking website is put up by a programming novice or someone with something to sell. Others are simply outdated.
不要忘了你还可以到网上寻求帮助,也可以看编译器返回的信息。不过要记住,考虑到你作为初学者难以判断网络上资源正确与否。有些看起来正经的所谓「编程」网站其实某些人忽悠恰钱的。而有些网站讲得东西早就老掉牙了。
Please don’t be too impatient for “realistic” examples. Our ideal example is the shortest and simplest code that directly illustrates a language facility, a concept, or a technique.
请不要觉得「现实」例子太长不看。我们给出的已经是最短,最简单,又能揭示语言功能,概念和方法的例子了。
Most real-world examples are far messier than ours, yet do not consist of more than a combination of what we demonstrate. Successful commercial programs with hundreds of thousands of lines of code are based on techniques that we illustrate in a dozen 50-line programs.
很多实际案例比我们给出的还杂乱无章,但也不过是由我们所展示的东西组合而成。数十万行代码的成功商业程序是基于我们在十几个50行程序中演示的技术。
The fastest way to understand real-world code is through a good understanding of the fundamentals.
理解现实代码最好的一种方式就是理解基础。
On the other hand, we do not use “cute examples involving cuddly animals” to illustrate our points. We assume that you aim to write real programs to be used by real people, so every example that is not presented as language-technical is taken from a real-world use. Our basic tone is that of professionals addressing (future) professionals.
另一方面,我们不会使用「可爱的有小动物」这样写给幼儿编程的例子。我们假设你是要成为专业程序员的人,所以一切风格与实际专业编程保持一致。我们的宗旨是用我们的专业知识培养下一代专业人才。
There are many ways to teach people how to program. Clearly, we don’t subscribe to the popular “the way I learned to program is the best way to learn” theories.
教人们编程有很多种方式。需要说清楚,我们不会说「我学编程的方法就是最好的方法」这种事情。
To ease learning, we early on present topics that would have been considered advanced only a few years ago.
为了方便学习,我们很早就提出了几年前还被认为是先进的主题。
Our ideal is for the topics we present to be driven by problems you meet as you learn to program, to flow smoothly from topic to topic as you increase your understanding and practical skills
我们的想法是以问题为驱动学习编程,在主题之间平滑过渡,慢慢增进你的理解和实践技能。
The major flow of this book is more like a story than a dictionary or a hierarchical order.
这本书更像是个故事,而非字典或者分层次的书。
It is impossible to learn all the principles, techniques, and language facilities needed to write a program at once. Consequently, we have to choose a subset of principles, techniques, and features to start with
只写几个程序不可能学会所有原理,方法和语言特性。因此,我们只从众多原理,方法和特性里选取一个子集作为开始。
More generally, a textbook or a course must lead students through a series of subsets. We consider it our responsibility to select topics and to provide emphasis.
一般来说,一本教材或者一门课程应该基于这些子集来进行编排或者教学。我们把选取主题和划重点这个活当作我们自己的责任。
We can’t just present everything, so we must choose; what we leave out is at least as important as what we leave in — at each stage of the journey
我们不可能包含所有东西,所以必须进行筛选;我们难免会遗漏一些重要的东西。
For contrast, it may be useful for you to see a list of (severely abbreviated) characterizations of approaches that we decided not to take:
下面是我们弃用的东西的列表,你先看看:
Naturally, we do not claim that these other approaches are never useful. In fact, we use several of these for specific subtopics where their strengths can be appreciated. However, as general approaches to learning programming aimed at real-world use, we reject them and apply our alternative: concrete-first and depth-first with an emphasis on concepts and techniques.
实话说,并不是指这些方法一无是处。恰巧相反,我们会在一些章节子话题里见机行事使用这些方法。但放眼学习编程的全局,我们不使用这些方法,我们用我们自己的方法:具体优先,深度优先,并辅以强调概念和方法。
We teach programming first and treat our chosen programming language as secondary, as a tool. Our general approach can be used with any general-purpose programming language.
我们首要教语言,其次把语言是做工具。我们希望自己的教学方法可以适用于任意通用编程语言。
Our primary aim is to help you learn general concepts, principles, and techniques. However, those cannot be appreciated in isolation.
我的主要目标是帮助你学习一般概念,原理和方法。然而,这并不能脱离语言单独做到。
For example, details of syntax, the kinds of ideas that can be directly expressed, and tool support differ from programming language to programming language
例如,语法的细节,这种通过语言直接表达的东西,还有支持工具,不同的语言之间相差很大。
However, many of the fundamental techniques for producing bug-free code, such as writing logically simple code (Chapters 5 and 6), establishing invariants (§9.4.3), and separating interfaces from implementation details (§9.7 and §14.1–2), vary little from programming language to programming language.
然而,许多能产出无bug代码的基本技术,比如(第5章和第6章会讲到)编写有逻辑的简单代码,建立不变式(9.4.3)以及分离接口(9.7 14.1-2),这些在不同语言之间差别不大。
Programming and design techniques must be learned using a programming language. Design, code organization, and debugging are not skills you can acquire in the abstract.
必须通过编程语言才能学会编程和设计方法。设计,代码结构和debug是无法在抽象(的理论)中学会的。
You need to write code in some programming language and gain practical experience with that. This implies that you must learn the basics of a programming language. We say “the basics” because the days when you could learn all of a major industrial language in a few weeks are gone for good.
你需要通过编写代码来获得实践经验。也就是说你必须要学习语言的基础。我们之所以强调「基础」是因为从前那种只用几周就学会一门语言的日子一去不返了。
The parts of C++ we present were chosen as the subset that most directly supports the production of good code. Also, we present C++ features that you can’t avoid encountering either because they are necessary for logical completeness or are common in the C++ community.
我们选择了C++ 的部分作为直接支持生成好代码的子集。此外,我们还提供了一些 C++ 特性,您躲不开这些特性,因为这些特性对于逻辑完整性是必需的,或者在C++社区中是常见的。
It is common to write C++ to run on a variety of machines. Major C++ applications run on machines we haven’t ever heard of!
C++跑在任意机器上是很常见的事。有些程序甚至跑在我们连名字都没听过的机子上。
We consider portability and the use of a variety of machine architectures and operating systems most important. Essentially every example in this book is not only ISO Standard C++, but also portable.
我们认为可移植性和保证在各种机器架构和操作系统中使用是非常重要的事情。本书中的所有例子不光符合ISO标准,还具有可移植性。
Unless specifically stated, the code we present should work on every C++ implementation and has been tested on several machines and operating systems.
除非有特殊情况,我们书中给出的C++代码在很多系统和机器上都通过了测试。
The details of how to compile, link, and run a C++ program differ from system to system
但编译,链接和运行的细节,每个系统是不一样的。
It would be tedious to mention the details of every system and every compiler each time we need to refer to an implementation issue
针对每个系统都提一嘴是非常麻烦的事。
In Appendix C, we give the most basic information about getting started using Visual Studio
and Microsoft C++ on a Windows machine.
在附录C中,我们给出了在Windows下使用Visual Studio和Microsoft C++的方法。
If you have trouble with one of the popular, but rather elaborate, IDEs (integrated development environments), we suggest you try working from the command line; it’s surprisingly simple.
如果你觉得IDE难用,那我们推荐你使用命令行,非常简单。
For example, here is the full set of commands needed to compile, link, and execute a simple program consisting of two source files, my_file1.cpp
and my_file2.cpp
, using the GNU C++ compiler on a Unix or Linux system:
比如在Linux下用GNU C++编译,链接,运行两个C++源文件:
c++ —o my_program my_file1.cpp my_file2.cpp
./my_program
Is programming all that there is to computer science? Of course not! The only reason we raise this question is that people have been known to be confused about this.
编程是计算机科学的全部吗?当然不是!我们提出这问题是因为大部分人都有这种困惑。
We touch upon major topics from computer science, such as algorithms and data structures, but our aim is to teach programming: the design and implementation of programs.
本书包含一些计算机科学主题,比如算法和数据结构,但讲这些是为了辅助编程教学:程序的设计和实现。
That is both more and less than most accepted notions of computer science: 这比大多数人接受的计算机科学概念要多一些,也要少一些
The aim of this book is to be part of a course in computer science (if becoming a computer scientist is your aim), to be the foundation for the first of many courses in software construction and maintenance (if your aim is to become a programmer or a software engineer), and in general to be part of a greater whole.
这本书可以作为计算机科学专业的一门课,可以作为后续所有软件构建和维护课程的基础。
We rely on computer science throughout and we emphasize principles, but we teach programming as a practical skill based on theory and experience, rather than as a science.
我们基于计科因为我们要强调原理,但我们教的编程,它基于理论和经验,比起一门科学,他更像一种实践技能。
The primary aim of this book is to help you to express your ideas in code, not to teach you how to get those ideas. Along the way, we give many examples of how we can address a problem, usually through analysis of a problem followed by gradual refinement of a solution.
这本书教你如何用代码表达想法,但并不能教你如何思考出那些想法。本书中,我们会给出问题的思考过程和改进解法的思路。
We consider programming itself a form of problem solving: only through complete understanding of a problem and its solution can you express a correct program for it, and only through constructing and
testing a program can you be certain that your understanding is complete.
我们把编程视作这样的东西:只有完全理解了问题,你才能得出正确的解法,进而写出正确的程序,而反过来,通过构建和测试程序你才能确认你的理解是否到位。
Thus, programming is inherently part of an effort to gain understanding. However, we aim to demonstrate this through examples, rather than through “preaching” or presentation of detailed prescriptions for problem solving.
因此,编程本质上是获得理解的努力的一部分。然而,我们的目标是通过实例来证明这一点,而不是通过“传道”或提供解决问题的详细处方。
(略)
(略)
本章完
当理论与实际不符时,要以实际情况为准,不要按图索骥,颠倒虚实。 ↩︎
drill和exercise都有「练习」的意思,所以我们这里不对这两个词做翻译。 ↩︎