目录(Contents)XX532A.2语法图(GrammarGraph)534A.3Barcus范式(BarcusNormalForm,BNF)535A.4C++关键字(C++Keywords)536A.5整数文法(IntegerGrammar)537A.6浮点数文法(Floating-PointNumberGrammar)538A.7编译单位(CompilingUnit)539附录B标准模板库导用(GuidetoUsingSTL)+.539B.1仿函数与算法(FunctionObject&Algorithm)545B.2STL仿函数(STLDefaultFunctionObjects)546B.3谓词(Predicates)547B.4函数配接器(FunctionAdapters)549B.5插入遍历器和流遍历器(Insert&StreamIterator)550附录C参考文献(References)www.TopSage.com
www.TopSage.com
■大家网TopSage.com第一部分基础编程TheBasicProgramming)(PartIwww.TopSage.com
www.TopSage.com
第1章概述(Introduction)C++到底难不难学,可以人云亦云吗?不管怎么说,它从开始诞生以来,发展势头一直很旺,旺到现在了。可以说,它很运气,但背后一定也有它的道理。C++是怎么发家的,设计一个这样的语言,具有这样的特性,都是有道理的,不是随便定一个功能,然后就坐等运气了。C++发展的历史说明了这一点。既然C++综合了各家之长,所以功能就多了,操作起来就简单了。为此,它很可以美滋滋地自豪一番。然而还是有人说它难学,这是正常的,否则,一学就会的东西,还用得着努力教和学吗?至于学习的结果,就因人而异,甚至大相径庭。难怪有的人趣味益然有的人大叹苦经。让我们先了解一下C++的功能和C++的来龙去脉再说吧,多知道它一些,就会多一些帮助你的细胞。还要知道编程是怎么回事,编程还需要有方法,已经有一些方法让我们模仿,那就不客气地模仿学一学吧。中国古代有位名画家主冕,他是因为信奉了这样一句话而成才的:没有学不会的事情!1.1程序设计语言(ProgrammingLanguage)语言是人类创造的工具,它用来表达意思,交流思想。程序设计(编程)语言(programminglanguage)是人类与计算机交流的工具。人们用程序设计语言描述需要解决的问题,用“语言翻译/编译器”加工以使计算机理解其描述尔后就能使计算机代替人们工作了。重要的是,人类的自然语言带有激越的情感,适合于在具有灵性知觉的人们之间相互交流,但不适合与刻板的计算机进行交流,而程序设计语言则适用于人类与计算机之间进行的理性交流。虽然编程语言最终目的是促使计算机为人类工作,但人们用编程语言对问题的描述方式与内容,随着使用群体的扩大,越来越多地成为人们相互之间交流过程描述与信息表达的工具。计算机刚发明的时候,计算机专家直接用0和1的序列作为机器指令来编程,难写难读,相对现在的编程方式来说,编程效率极低。为了方便编程,专家们用名字来代替01序列所规定的操作与数据,即汇编语言。用汇编语言编程,虽然相对提高了编程效率,但仍然不够直观方便。此后,能够带来编程方便的各种用途的高级语言相继诞生。高级语言相对低级语言来说,抽象性(CH11.1)更好,因而编程就更加方便。于是编程人数迅速增加,软件产业因而得到突飞猛进的发展。计算机上的机器指令也称为机器代码,它是机器语言的程序。机器语言是低级语言,汇编语言是机器语言的直接符号表示,所以基本上也是低级语言。而C++则是高级语言例如,对于C++语句:www.TopSage.com
www.TopSage.com
3第1章概述(Introduction)//把表达式3a-2b+1的结果赋值给aa=3*a-2*b+1;写成汇编语言和某个特定的机器语言则为:(1)mov eax,DWORD PTR a $[ebp]8b45fc(2)8d0440lea eax,DWORD PTR [eax+eax*2](3)8b4df8mov ecx, DWORD PTR b_$[ebp]03 c9(4)add ecx,ecx(5)2b c1sub eax, ecx40(6)inc eax(7)8945fcmovDWORD PTRa_s[ebp],eax上列语句中的右边为某个机器的机器代码。显然,对于刚涉足编程学习的人来说,无异于是在看天书。但它们表达了一个计算机能够理解的动作序列,达到了与计算机沟通的目的。(1)中的mov表示执行一个数据挪动(复制)动作,eax是CPU中的某个寄存器,它表示复制的目的地,DWORDPTR表示复制的是4个字节(CH3.1.3),后面是源数据存放的地址,用方括号括起来的ebp表示数据段的位置,a_S表示从ebp开始的变量a的地址偏移。该命令表示将变量a的值复制到寄存器eax中。(2)中的lea是取数操作,它把寄存器eax中的值加上2倍eax的值再放到eax中,即eax中的值为3xa。(3)与(1)相似,它把变量b的值复制到寄存器ecx中。(4)中的add表示加法操作,它把寄存器ecx的值加上ecx的值,仍放回ecx中,使得ecx中的值为2xb。(5)中的sub表示减法操作,它把寄存器eax的值(3xa)减去寄存器ecx的值(2xb)的结果放入eax。(6)中的inc表示加一操作,它把寄存器eax的值加1。原先eax中的值为3xa-2xb所以操作结果为:3×a-2xb+1。(7)中的mov是把寄存器eax的值复制到变量a中,即实现了C++语句:a=3*a-2*b+1。显然,从右边的机器代码编程到左边的汇编语言编程,在方法上改进了一大步。人们可以通过专门的语言对操作进行简单的描述而不是使用硬性抽象记忆来进行机器编码,因而方便了许多。然而,用汇编语言对一个在C++来说是简单的赋值表达式的编程,却必须详尽地描述其具体的数据操作和转移过程,中间涉及数据存放地址、算术运算、数据存放与读取,还用到了以加法代替乘法的技巧,可谓用尽了十八般武艺。显然,C++可以更抽象地描述数据与过程,在该赋值表达式的描述中,我们看到,它只需关注数值和运算,无须关心具体的实现。程序语言越低级,则必须对过程描写得越具体,指令也就越接近机器的硬件逻辑。相反,程序语言越高级,就越接近对问题的描述与表达,因而更直观,更容易被人们所理解。因此,程序语言的发展,总是从低级到高级,也就是从具体描述到抽象描述,当然高级语言的抽象描述最后都自动转化成了机器的具体实现。www.TopSage.com
www.TopSage.com
大网4第一部分基础编程(PartITheBasicProgramming)相应地,语言编译器的发展,则是从简单到复杂的过程。语言越是高级,描述越是抽象,则自动化转换的程度就越高。也就是说,机器对语言的理解能力越来越强了,以致人们对问题有个相对简单的描述(编程),就能够被机器所理解。1.2C++前史(TheOriginsandHistoryofC++)1953年12月,IBM公司的JohnBackus写了一份备忘录,建议为IBM704设计一种全新的编程语言。Backus多年工作在计算机上,深切体会到编程的困难,他的目标是设计一种用于科学计算的“公式翻译语言”。他带领的一个团队,终于在1954年完成了FORTRAN语言的设计和实现。在那以后,不同版本的FORTRAN语言纷纷面世。1966年,美国统一了它的标准,称为FORTRAN66语言,此后,又被更新为FORTRAN77和FORTRAN90。FORTRAN语言的后继版本要兼容以前大量的FORTRAN老程序,这一负担阻碍了它,无法革新使之具备现代编程语言特征。但不管怎样,FORTRAN语言一直活跃了40多年Backus为此摘取了1977年度的“图灵奖”。科学计算借助于FORTRAN获得快速进展的时候,还没有一种适用于商业计算的语言。美国国防部注意到了这种情况,1959年5月,五角大楼委托GraceMurrayHopper博士领导一个委员会,开始设计面向商业的通用语言COBOL。COBOL最重要的特征是语法与英文很接近,可以让不懂计算机的人也能看懂程序。1968年,对COBOL语言进行了标准化后又在1974年和1984年进行了标准化更新。COBOL语言曾经风靡一时。1958年,一个由国际商业和学术计算机科学家组成的委员会在瑞士开会,探讨改进FORTRAN问题,并尝试设计一种标准化的计算机语言。1960年,该委员会在1958年讨论的基础上,定义了一种新的语言一一国际代数语言ALGOL60,首次引入了局部变量和递归的概念,在数学表达和算法描述上比FORTRAN更出色,而且它不是解释执行,而是编译后运行,比FORTRAN程序效率更高。但由于ALGOL语言的设计要求是独立于机器的,所以就面临许多语言实现方面的技术问题,致使ALGOL语言无法流行。但它却演变为其他编程语言设计的概念基础。20世纪60年代中期,美国Dartmouth学院的JohnG.Kemeney和ThomasE.Kurtz认为,像FORTRAN这样的编程语言,都是为专业人员设计的,而他们希望能为无经验的人提供一种简单的编程语言,特别希望那些非计算机专业的学生也能通过这种语言学会使用计算机。于是,他们在简化FORTRAN的基础上,研究出了BASIC语言。由于BASIC语言易学易用,很快就成为最流行的计算机语言之一,几乎所有的小型和个人计算机都使用它。BASIC语言发展到后来,出现了许多改版,典型的有1983年推出的TrueBASIC,1985年推出的QBASIC,以及1991年推出的VisualBASIC(简称VB)。VB一直风靡至今,长盛不衰。同在60年代中期,美国MIT的JohnMcCarthy等人设计和实现了用于人工智能研究的Lisp语言。Lisp语言是基于表处理的函数语言,由于该语言更面向问题,因此较容易编程,描述能力更强,更易于进行程序正确性验证和软件维护。但由于实现技术复杂,处理文件等能力不强,运行效率低,该工具一直停留在实验室阶段。www.TopSage.com
www.TopSage.com