第 5 章 语句
一个表达式末尾加上分号就变成了表达式语句 expression statement
。
空语句 null statement
。
复合语句 compound statement
也称块 block
是用花括号括起来的语句和声明序列。在程序某个位置如果语法上需要一个语句,逻辑上需要多个语句则应该使用块。
5.3 条件语句
5.3.2 switch 语句
switch 内部的变量定义
注意 switch 执行时可能跳过某些 case 标签,被跳过的标签可以含有变量声明,但不能进行显式的初始化。
如果想为某个标签定义变量则应该把变量定义包裹在块内,使得其他标签都在其作用域外。
5.4 迭代语句
5.4.3 范围 for 语句
range for statement
。
for (declaration : expression)
statement
范围 for 的 expression 可以是数组、可以是声明了 begin 和 end 的类。这两者都不是时会尝试调用 begin(expression) 和 end(expression)。
这里注意,范围 for 虽然会在一开始得到首尾迭代器值,但不能用来翻倍 vector,因为在插入新元素的过程中旧的迭代器可能会失效。
5.6 try 语句块和异常处理
异常处理包括:
throw 表达式,异常检测部分使用 throw 表达式表示它遇到了无法处理的问题。我们说 throw 引发 raise
了异常。
try 语句块,以 try 开始以一个或多个 catch 子句 catch clause
结束,try 中抛出的异常会被某几个 catch 子句处理。catch 子句被称为异常处理代码 exception handler
。
一套异常类 exception class
,用于在 throw 表达式和相关的 catch 子句之间传递异常的具体信息。
#include <iostream>
#include <stdexcept>
using namespace std;
int main() {
int a, b;
while (cin >> a >> b) {
try {
if (a != b) {
throw runtime_error("a != b");
} else {
break;
}
} catch (runtime_error err) {
cout << err.what() << "\ntype Y to input a and b again\n";
char c;
if(!(cin >> c) || c != 'Y') {
cout << "early quit\n";
return 0;
}
}
}
cout << "normal quit\n";
return 0;
}
5.6.3 标准异常
<exception> 定义了最通用的异常类 exception。它只报告异常发生,不提供任何额外信息。
<stdexcept> 中定义了以下异常类。
exception // 常见问题
runtime_error // 运行时错误
range_error // 运行时错误:结果超出有意义值的范围
overflow_error // 运行时错误:上溢
underflow_error // 运行时错误:下溢
logic_error // 逻辑错误
domain_error // 逻辑错误:参数对应的结果值不存在
invalid_argument // 逻辑错误:无效参数
length_error // 逻辑错误:试图创建一个超出该类型最大长度的对象
out_of_range // 逻辑错误:使用一个超出有效范围的值
<new> 中定义了 bad_alloc 异常类型。
<type_info> 中定义了 bad_cast 异常类型。
其中我们只能以默认初始化方式初始化 exception、bad_alloc、bad_cast 对象。
其他异常类型则需要使用 string 或 C 风格字符串初始化。
异常类型定义了一个成员函数 what()。返回值为一个 const char* 用来提供错误信息的文本。
Next: 《C++ Primer》 拾遗 第 6 章 函数