C++ Primer 第四版读书笔记(五)之语句
通常情况下,语句是顺序执行的。但是,除了最简单的程序外,只有顺序执行往往并不足够。为此,C++定义了一组控制流语句,允许有条件地执行或者重复地执行某部分功能。
1.1 简单语句
C++中,大多数语句以分号结束。
表达式语句用于计算表达式。
1.2 声明语句
在C++中,对象或类的定义或声明也是语句。
1.3 复合语句
复合语句,通常被称为块,使用一对花括号括起来的语句序列。块标识了一个作用域,在块中引入的名字只能在该块内部或者嵌套在块中的子块里访问。通常,一个名字只从其定义处到该块结尾这段范围内可见。
复合语句用在语法规则要求使用单个语句但程序逻辑却需要不止一个语句的地方。
1.5 语句作用域
在条件表达式中定义的变量必须初始化,该条件检验的就是初始化对象的值。
对于在控制语句中定义的变量,限制其作用域的一个好处是,这些变量名可以重复使用而不必担心它们的当前值在每一次使用时是否正确。对于作用域外的变量,是不可能用到其在作用域内的残留值的。
1.6 if 语句
if语句根据特定表达式是否为真来有条件的执行另一个语句。
1.7 switch 语句
深层嵌套的if-else语句往往在语法上是正确的,但逻辑上却没有正确地反映程序员的意图。
1.7.1 switch 中的控制流
存在一个普遍的误解:以为程序只会执行匹配的case标号相关联的语句。实际上,程序从该点开始执行,并跨越case边界继续执行其他语句,直到switch结束或者遇到break语句为止。
1.7.2 switch表达式与case标号
case标号必须是整型常量表达式。
如果两个case标号具有相同的值,同样也会导致编译时错误。
1.7.3 switch 内部的变量定义
对于switch结构,只能在它的最后一个case标号或default标号后面定义变量。
制定这个规则是为了避免出现代码跳过变量的定义和初始化的情况。
在这种情况下,如果需要为某个特殊的case定义变量,则可以引入块语句,在该块语句中定义变量,从而保证这个变量在使用前被定义和初始化。
1.8 while 语句
当条件为真时,while语句反复执行目标语句。
1.9 for循环语句
一般来说,用于对每次循环过程中都要修改的变量进行初始化,或者赋给一个起始值。
for循环的使用
假如有下面的for循环,用于输出vector对象的内容:
for(vector<string>::size_type ind =0; ind != svec.size(); ++ind)
{
cout << svec[ind];
if(ind + 1 != svec.size())
cout << " ";
}
它的计算顺序如下:
(1)循环开始时,执行一次init-statement(初始化语句)。在这个例子中,定义了ind,并将它初始化为0;
(2)接着,求解condition(循环条件)。如果ind不等于svec.size(),则执行for循环体,否则循环结束。如果第一次循环时,条件就为false,则不执行for循环体。
(3)如果条件为true,则执行for循环体。
(4)最后,求解exprission。
1.8.1 省略for语句头的某些部分
for与语句中,可以省略init-statement(初始化语句)、condition(循环条件)或者expression(表达式)中的任何一个(或全部)。
1.8.2 for语句头中的多个定义
可以在for语句的init-statement中定义多个对象;但不管怎样,该处只能出现一个语句,因此所有的对象必须具有相同的一般类型。
1.8.3 try块和异常处理
异常机制提供程序中错误检测与错误处理部分之间的通信。C++的异常处理中的包括:
1、throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw引发了异常条件。
2、try,错误处理部分使用它来处理异常。try语句块以try关键字开始,并以一个或多个catch子句结束。在try块中执行的代码所抛出的异常,通常会被其中一个catch子句处理。由于它们“处理”异常,catch子句也称为处理代码。
3、由标准库定义的一组异常类,用来在throw和相应的catch之间传递有关的错误信息。
1.8.3.1 throw表达式
系统通过throw表达式抛出异常。throw表达式由关键字throw以及尾随的表达式组成,通常以分号结束,这样它就成了表达式语句。throw表达式的类型决定了所抛出异常的类型。
1.8.3.2 try块
try块的通用语法形式是:
try
{
program-statements
}catch(exception-specifier)
{
handler-statments
}
catch(exception-specifier)
{
handler-statments
}
try块以关键字try开始,后面是用花括号括起来的语句序列块。try块后面是一个或多个catch子句。每个catch子句包括三个部分:关键字catch,圆括号内单个类型或者单个对象的声明——称为异常说明符,以及通常用花括号括起来的语句块。如果选择了一个catch子句来处理异常,则执行相关的块语句。一旦catch子句执行结束,程序流程立即继续执行紧随着最后一个catch子句的语句。