此章知识点不多,都是较为基础的或是C语言中学过的,便不多赘述
一、条件语句[P156]
if-else语句——略
switch 语句——大部分略
default 标签
如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句。
T
I
P
1
\color{#FF0000}{TIP1}
TIP1:即使不准备在default标签下做任何工作,定义一个default标签也是有用的。其目的在于告诉程序的读者,我们已经考虑了默认的情况,目前只是什么也没有做
二 、迭代语句[P165]
while语句——略
for语句——大部分略
for语句头中的多重定义
和其他的声明一样,init-statement也可以定义多个对象。但是init-statement只能有一条声明语句。因此,所有变量的基础类型必须相同。如:
for(decltype(v.size()) i = 0,sz = v.size();i != sz;++i)
v.push_back(v[i]);
省略for语句头的某些部分
for语句头能省略掉init-statement、condition、expression中的任何一个(或者全部)。【此处不再举例】
范围for语句
C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素。范围for语句的语法形式是:
for (declaration : expression)
statement
expression表示的是一个序列,比如用花括号括起来的初始值列表、数组、或者vector或string等类型的对象,这些类型的公共特点是拥有能返回迭代器的begin和end成员。
declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型最简单的办法是使用auto类型说明符。
每次迭代都会重新定义循环控制变量,并将其初始化成序列中的下一个值。之后才会执行statement,直到所有元素都处理完毕后终止。
e
x
a
m
p
l
e
1
\color{#0000FF}{example1}
example1:把vector中每个元素翻倍
vector <int > v = {0,1,2,3,4,5,6,7,8,9};
for(auto &r : v)//一定要使用引用字符
r*=2;
do-while语句——略
五、跳转语句[P170]
break语句
break负责终止离它最近的while、do-while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。break语句的作用范围仅限于最近的循环或者switch。
continue语句
continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。
goto语句
goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句。
e
x
a
m
p
l
e
2
\color{#0000FF}{example2}
example2:goto语句演示
//...
goto end;
int ix = 10;
end:
ix = 42;
T I P 2 \color{#FF0000}{TIP2} TIP2:不要在程序中使用goto语句,因为它使得程序既难理解又难修改
六、try语句和异常处理[P172]
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。典型的异常包括拾取数据库连接、遇到意外输入等等。处理反常行为可能是设计所有系统最难的一部分。
异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。在C++语言中,异常处理包括:
throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发(raise)了异常。
try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。所以他们也被称为异常处理代码
一套异常类(exception class) ,用于在throw表达式和相关的catch子句之间传递异常的具体信息。
throw表达式
程序的异常检测使用throw表达式引发一个异常。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是跑出的异常类型。throw表达式后面通常紧跟一个分号,从而构成一条表达式语句:
if(item1.isbn()!=item2.isbn())
throw runtime_error("Data must refer to same ISBN");
//如果程序执行到了这里,表示两个ISBN是相同的
cout<<item1 + item2<<endl;
类型runtime_error是标准库类型的一种,定义在stdexcept头文件中。
try语句块
try语句块的语法形式是:
try{
program-statements
}catch (exception-declaration) {
handler-statements
}catch (exception-declaration) {
handler-statements
}//…
编写处理代码
e x a m p l e 3 \color{#0000FF}{example3} example3:try语句演示
while (cin>>item1>>item2){
try{
//执行添加两个Sales_item对象的代码
//如果添加失败,代码抛出一个runtime_error异常
}catch (runtime_error err){
//提醒用户两个ISBN必须一致,询问是否重新输入
cout<<err.what()
<<"\nTry again?Enter y or n"<<endl;
char c;
cin>>c;
if(!cin||c=='n')
break;//跳出while循环
}
}
程序本来要执行的任务出现在try语句块中,这是因为这段代码可能会抛出一个runtime_error类型的异常。
try语句块对应一个catch子句,该子句负责处理类型为runtime_error的异常。如果try中真的抛出了此异常,接下来就执行catch块内的语句。
函数在寻找处理代码的过程中退出
在复杂的系统中,程序在遇到抛出异常的代码前,其执行路径可能已经经过了多个try语句块。寻找处理代码的过程与函数调用链刚好相反,异常抛出时首先搜索抛出该异常的函数。如果没找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。如果还是没找到,急速搜索调用它的函数,以此类推,沿着程序的执行路径逐层回退,直到找到合适类型的catch子句为止。
如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。
标准异常
exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息;
stdexcept头文件定义了几种常用的异常类,如下表所示;
new头文件定义了bad_alloc异常类型;
type_info头文件定义了bad_cast异常类型;
异常类 | 说明 |
---|---|
exception | 最常见的问题 |
runtime_error | 只有运行时才能检测出的问题 |
range_error | 运行时出错:生成的结果超出了有意义的值域范围 |
overflow_error | 运行时出错:计算上溢 |
underflow_error | 运行时出错:计算下溢 |
logic_error | 程序逻辑错误 |
domain_error | 逻辑错误:参数对应的值不存在 |
invalid_argument | 逻辑错误:无效参数 |
length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
out_of_range | 逻辑错误:使用一个超出有效范围的值 |