



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章1. 通常情况下,语句是顺序执行的。但除了最简单的程序外,只有顺序执行往往并不够。C+定义了一组控制语句,允许有条件地执行或重复执行某些功能。If和switch提供了条件分支结构,而for, while, do while则支持重复执行的功能。后几种称为循环语句。2. 表达式后面加上分号就是表达式语句。空语句常用于在循环条件判断部分就能完成全部循环工作的情况。使用空语句时应加上注释,以便任何读这段代码的人都知道该语句是有意省略的。但不能随便用空语句。这个程序将会是无限次的循环。与缩进的意义相反,此自增语句并不是循环的一部分。循环体为空语句。对象或类的定义或声明被称为声明语句。3. 块标识了一个作用域。一个名字只从其定义处到该块的结尾可见。 比如在for或while循环中,常用块语句。4. 在语句的控制结构中定义的变量,仅在定义它们的块语句结束前有效。其作用域限制在语句体内。语句体本身就是一个块语句。其中也可能包括其它块。它是一个局部变量。其作用域局限在语句内部。被称为语句作用域。在条件表达式中定义的变量必须初始化。该条件检验的就是初始化对象的值。如果程序需要访问某个控制结构中的变量,那么这个变量必须在控制语句外部定义。 早期的C+版本以不同的方式处理for语句中定义的变量的作用域。将for语句头定义的变量视为在for语句之前定义。允许在for语句的作用域外访问控制变量。 对地在控制语句中定义的变量,限制其作用域的一个好处是,这些变量名可以重复使用而不必担心它们的当前值在每一次使用时是否正确。对于作用域外的变量,是不可能用到其在作用域内的残留值 的。5. 其中的condition部分必须用圆括号括起来。它可以是一个表达式,或一个初始化声明。 如果在条件表达式中定义了变量,变量必须初始化。将已初始化的变量值转换为bool值后,该bool值决定条年是否成立。变量类型可以是任何可转为bool型的类型,它可以是算术类型或指针类型。至于一个类类型是否能用在条件表达式中取决于类本身。我们学过的类类型中,IO类型可用作条件,但vector,string一笛膜不可用作条件。6. 上程序用于找出ivec中的元素的最小值,并记录该最小值出现的次数。在上例中,statement2本身是一个if语句,所以出现了else if的形式。 对于if语句还有一个重要的复杂问题没有考虑。上例中,没有一个if分支能直接处理元素值大于minVal的情况。从逻辑上来说,可以忽略这些元素,如果该元素比当前已找到的最小值大,就没什么要做的。但通常需要使用if语句为三种不同情况提供执行的内容。即如果一个值大于、小于或等于其他值时,可能都需要执行特定的步骤。为此,重写循环,显式处理这三种情况。7. 这样三路测试精确地控制了所有情况。但是,简单地把前两个情况用一个嵌套if语句实现将会产生问题。8. 出现这种情况往往称为悬垂else问题。产生于一个语句包含的if子句多于else子句时,对于每一个else,究竟它们归属于那个if. 在C+中,通过将else匹配给最后出现的沿未匹配的if子句来解决。可以通过花括号将内层的if语句括起来成为复合语句,从而迫使这个else子句与外层的if匹配。 有些编程风格建议总是在if后面使用花括号。这样做可以避免日后修改代码时产生混乱和错误。至少,无论if或while后面是简单语句,还是任意其他语句,使用花括号都是一个比较好的做法。9. 深层嵌套的if-else语句往往在语法上是正确的,但在逻辑上却没有正确地反映程序员的意图。错误的else-if匹配往往容易被忽略,或对语句做其他修改,很难保证正确。Switch语句提供了一种更方便的方法来实现深层嵌套的if/else逻辑。 以下程序用于统计五个元音在文本里分别出现的次数。 break用于将控制跳出switch,继续执行switch后面的第一个语句。 存在一个普遍的误解:以为程序只会执行匹配的case标号相关联的语句。实际上,程序从该点开始执行,并跨越case边界继续执行其他语句,直到switch结束或遇到break语句为止。对于switch结构,漏写break是常见的程序错误。 尽管没有严格要求在switch结构的最后一个标号后指定break,但为了安全起见,最好在每个标号后提供一个break.即使是最后一个标号也一样。 故意省略case后面的break是很罕见的,因此应提供一些注释说明其逻辑。 default:子句提供了相当于else子句的功能,如果所有case与switch表达式的值都不匹配,且default标号存在,则执行default标号后面的语句。那怕没有语句要在default标号下执行,定义default标号仍然是有用的。定义default是为了告诉它的读者,表明这种情况已经考虑到了,只是没什么要执行的。 10. 有一种情况是,程序员希望在case标号后省略break语句,允许程序向下执行多个case标号。这时,两个或多个Case值的由相同的动作序列来处理。由于系统限定一个Case只能与一个值相关联,为了指定一个范围,典型的作法是,把Case标号依次排列。若为了计算文本中元音总数,则:实际上,由于每个case不一定要另起一行,为了强调这些case表示的是一个要匹配的范围,可以将它们全部在一行中列出。12. 在switch表达式中可以定义和初始化一个变量。Ival被初始化为get_response函数的调用结果,其值将要与每个case标号作比较。该变量存在于switch语句中,在switch结构外就不再有效了。Case标号必须是整形常量表达式。以下的case将导致编译错误。如果两个case标号具有相同的值,同样会导致编译时错误。13. Switch结构中,只能在它的最后一个case和default后定义变量。制定这个规则是为了避免出现代码跳过变量的定义和初始化的情况。回顾变量的作用域,变量从它的定义点开始有效,直到它所在块结束前为止。如果在两个case之间定义变量,该变量会在块结束前一直存在。对于定义在该变量的标号后的其他case标号,它们所关联的代码都可以使用这个变量。如果switch从那些后续case标号开始执行,这个变量可能还未定义就要使用了。在这种情况下,如果需要为某个特殊的case定义变量,可以引入块语句。在该块语句中定义变量,从而保证这个变量在使用前被定义和初始化。14. Condition不能为空。它可以是一个表达式,或者是提供初始化的变量定义。在循环条件中定义的任意变量只在与while关联的块语句中可见。循环条件自身或在循环体内必须做一些相关操作来改变循环条件表达式的值,否则循环可能永远不会结束。在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。16. 其中的init-statement必须是声明语句,表达式语句或空语句。用来对每次循环过程中都要修改的变量初始化,或者赋初值。Condition用来控制循环。Expression用于修改在init-statement中初始化并在condition中检查的变量。如果第一次求欠妥 condition为false,则始终不执行expression.for循环中定义的任何对象只限制在for循环体里可见。 for语句头中,可以省略初始化语句、循环条件或者表达式中的任一个。若省略循环条件,等效于循环条件永远为true.此时,循环体内必须包含一个break或return,否则循环会一直执行直到耗尽系统资源为止。17. 与while不同,do while总是以分号结束。Condition不能为空。如果condition为假,则循环结束,否则循环重复执行。不可以在condition中定义变量。也中可以在statement处定义变量而在condition中使用。因为,如果在condition中定义变量,对变量的任何使用都将发生在变量定义之前。而在statement中定义的变量,只存在于while之前的花括号中,因此不能在condition中用。20. Goto使跟踪程序控制流变得很困难。并使程序难以理解,难以修改。所有使用goto的程序都可以写为不用goto的形式。因此没有必要用goto语句。在上例中,执行goto时,首先撤销变量sz,然后程序的控制流程跳转到带begin:标号的语句继续执行。再次重新创建和初始化sz变量。Goto不能跨越变量的定义向前跳转。因为向前跳过未执行的变量定义语句,意味着变量可能在没有定义的情况下使用。向后跳回到一个变量定义之前,则会使系统撤销这个变量,然后重新创建它。21. 在设计各种软件系统的过程中,处理程序中的错误和其他反常行为是最困难的部分之一。像通信交换机和路由器这类长期运行的交互式系统必须将90%的代码用于实现错误检测和错误处理。随着基于web的应用程序在运行时不确定性的增多,越来越多的程序员更加注重错误的处理。 在设计良好的系统中,异常是程序错误处理的一部分。当程序代码检查到无法处理的问题时,异常处理就特别有用。此时,检测出问题的那部分程序需要一种方法把控制权转到可以处理这个问题的那部分程序。错误检测程序还必须指出具体出现了什么问题,并可能需要提供一些附加信息。 错误检测部分使用throw表达式来说明遇到了不可处理的错误。22. 系统通过throw表达式抛出异常。常由关键字throw及尾随的表达式组在。通常以分号结束。这样它就成了表达式语句。Throw表达式的类型决定了它所抛出异常的类型。在更简单的程序中,把将对象相加的部分和负责和用户交互的部分分开。用throw抛出异常来改写检测代码。23. 这段代码检查ISBN对象是否不相同。如果不同,则停止程序的执行,并将控制转移给处理这种错误的处理代码。Throw使用了一个表达式。该表达式是runtime_error类型的对象。Runtime_error是标准库异常类中的一种。在stdexcept头文件中定义。我们通过传递string对象来创建runtime_error对象,这样可以提供更多关于所出现问题的相关信息。24. Try块以关键字try开始,后面是用花括号括起来的语句序列块。Try后面是一个或多个catch子句。每个catch子句包括三部分:catch,异常说明符,句块。如果选择了一个catch子句来处理异常,则执行相关的块语句。一旦catch子句执行结束,程序流立即继续执行紧随着最后一个catch子句的语句。在try块及catch子句中声明的变量,不能在try外面用。 在复杂的系统中,程序的执行路径也许在遇到抛出异常的代码之前,就已经经过了多个try块。一个try块可能调用了包含另一个try块的函数,它的try块又调用了含有try块的另一个函数,如此类推。 寻找处理代码的过程与函数调用刚好相反。抛出异常时,首先要搜索的是抛出异常的函数。如果没有找到匹配的catch,则终止这个函数的执行,并在调用这个函数的函数中寻找相配的catch.如果仍没有找到相应的处理代码,该函数同样要终止。如此类推,直到找到适当的catch为止。 如果不存在处理该异常的catch子句,程序的运行就要跳转到名为terminate的标准库函数,该函数在exception头文件中定义。这个标准库函数的行为依赖于系统。通常它的执行将导致程序非正常退出。 在程序中出现的异常,如果没有经try块定义,都以相同的方式来处理。毕竟,如果没有任何try块,就没有捕获异常的处理代码,此时,如果发生了异常,系统将自动调用terminate终止程序的执行。25. C+标准库定义了一组类,用于报 告在标准库中的函数遇到的问题。程序员可在自己编写的程序中使用这些标准异常类。标准库异常类定义在四个头文件中。26. 标准库异常类只提供很少的操作,包括创建、复制异常类型对象以及异常类型对象的赋值。Exception,bad_alloc及bad_cast只定义了默认构造函数,无法在创建这些类型的对象时为它们提供初值。其他异常类则只定义了一个使用string初始化式的构造函数。当需要定义这些异常类型的对象时,必须提供一个string参数。String初始化式用于为所发生的错误提供更多的信息。 异常类型只定义了一个名为what的操作。这个函数不需要任何参数,并且返回const char*类型的值。它返回的指针指向一个c风格字符串。使用C风格字符串的目的是为所抛出的异常提供更详细的文字描述。 what函数所返回的指针指向C风格字符数组的内容。这个数组的内容依赖于异常对象的类型。对于接受string初始化式的异常类型,what函数将返回该string作为C风格字符数组。对于其他异常类型,返回的值则根据编译器的变化而不同。27. 以前介绍了如何使用预处理变量来避免重复包含头文件。C+程序员有时也会使用类似的技术有条件地执行用于调试的代码。程序所包含的调试代码仅在开发过程中执行。当应用程序已完成,并准备提交时,就会将调试代码关闭。可使用NDEBUG预处理变量实现有条件的调试代码。 如果NDEBUG未定义,程序会将信息写到cerr。如果已定义,程序执行时会跳过这段。 在开发过程中,只要保持NDEBUG未定义就会执行其中的调试语句。开发完成后,要将程序交付给客户时,可通过定义NDEBUG预处理变量,有效地删除这些调试语句。大多数的编译器都提供定义NDEBUG的命令行选项。 以上命令等效于在mai
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 魅力新疆解说课件
- 高铁铁路授课课件
- 电脑耗材培训知识课件
- 电能仪表工艺知识培训课件
- 电缆附件安装知识培训课件
- 电站电工基础知识培训课件
- 电磁灶用电安全知识培训课件
- 高热惊厥业务学习课件
- 3-4-Dihydroxybenzeneacetic-acid-13C-18O2-生命科学试剂-MCE
- 高校戏曲鉴赏课件
- 2025秋外研新版三起点小学英语四年级上册教学计划
- 2025北师大版(2024)三年级上册数学教学计划
- 2025云南省腾冲市边防办招聘边境专职联防员(10人)笔试参考题库附答案解析
- 中职乐理课教学课件
- 中小会计师所发展困境及对策
- 2025至2030中国微波器件行业市场调研分析及竞争形势与投资发展报告
- 2025-2026学年人教鄂教版(2017)小学科学六年级上册教学计划及进度表
- 心理委员基本知识培训课件
- 2025年12123学法减分考试题库及答案
- 外伤出血急救课件
- 医院感染管理手卫生
评论
0/150
提交评论