C++primer笔记——第五章【语句】

【第五章】 语句


1、如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应使用空语句。
或者当循环的全部工作在条件部分就可以完成时,也会用到空语句

2、如果在程序的某个地方,语法上需要一条语句,但是逻辑上需要多条语句,就应该使用复合语句。
复合语句用花括号括起来,也称为块。一个块就是一个作用域,在块中引入的名字只能在块内部以及嵌套在块中的子块里访问

3、悬垂else:当程序中的if分支多于else分支时,如何为else寻找与之匹配的if分支的问题
规定else与离它最近的尚未匹配的if匹配,从而消除了程序的二义性


4、break语句的作用是终端当前的控制流


5、switch语句中,case关键字和它对应的值一起被称为case标签。case标签必须是整型常量表达式(注意:要是整数,还要是常量!)


6、如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句。


7、如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处是非法的


8、定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程


9、范围for语句:
这种语句可以遍历容器或其他序列的所有元素
for(declaration : expression)
statement
expression必须是一个序列。注意可以是花括号括起来的初始值列表,数组或者vector或string等类型的对象
这些类型的共同特点是拥有能返回迭代器的begin和end成员

10、do while语句至少执行一次循环,注意while后要有分号表示语句结束


11、break语句负责终止离它最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行


12、break语句只能出现在迭代语句或者switch语句内部。break语句的作用范围仅限于最近的循环或者switch


13、continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。只能出现在while、for和do while循环的内部,或者嵌套在此类循环的语句或块的内部
和break语句类似的是:出现在嵌套循环中的continue语句也仅作用于离它最近的循环
和break语句不同的是:只有当switch语句嵌套在迭代语句内部时,才能在switch里使用continue

14、continue语句中断当前的迭代,但是仍然继续执行循环。
1)对于while或do while语句,继续判断条件的值
2)对于传统for循环,继续执行for语句头的表达式
3)对于范围for循环,则是用序列中的下一个元素初始化循环控制变量

15、goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句
goto label;
label是用于标识一条语句的标识符。带标签语句是一种特殊的语句,在它之前有一个标识符以及一个冒号
标签标识符独立于变量或其他标识符的名字,因此,标签标识符可以和程序中其他实体的标识符使用同一个名字而不会相互干扰。
goto语句和控制权专项的那条带标签的语句必须位于同一个函数内


5.6 try语句块和异常处理
1、throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常

2、try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句结束。
try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句处理异常,所以它们也称做异常处理代码

3、一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息

5.6.1 throw表达式
4、在真实的程序中,应该把对象相加的代码和用户交互的代码分离开来。应使程序检查完以后不再直接输出一条信息,而是抛出一个异常:
if(a != b)
throw runtime_error("xxxxxx");
// 如果程序执行到这,代表a=b
cout<< a+b<<endl;
在这段代码中,如果两个数不一样,就抛出一个异常,该异常是类型runtime_error的对象。抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。

5.6.2 try语句块
语法:
try{
program-statement
} catch (exception-declaration) {
handler-statement
} catch (exception-declaration) {
handler-statement
} // ..
try语句块的一开始是关键字try,随后紧跟一个块,这个块就像大多数时候那样是花括号括起来的语句序列

跟在try块之后的是一个或多个catch子句。catch子句包括三部分:关键字catch、括号内一个(可能是未命名的)对象的声明(称作异常声明)、以及一个块
当选中了某个catch子句处理异常之后,执行与之对应的块。
catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句继续执行

try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问

5、
int a, b;
while (cin >> a >> b)
{
try{
//if (a != b)
// throw runtime_error("a != b");
}
catch(runtime_error err){
cout << err.what()
<< "\nTry again? Enter y or n...\n";
char c;
cin >> c;
if (!cin || c == '\n')
break;
}
}
程序本来要执行的任务出现在try语句块中,这是因为这段代码可能会抛出一个runtime_error类型的异常。
如果try语句块的代码抛出了这个异常,接下来执行catch块内的语句。

6、每个标准库异常类都定义了名为what的成员函数,这些函数没有参数,返回值是C风格字符串(即const char*)
其中,runtime_error的what成员返回的是初始化一个具体对象时所用的string对象的副本

函数在寻找处理代码的过程中退出:
P175









猜你喜欢

转载自blog.csdn.net/csdn_dzh/article/details/80975395