《C++ Primer》 拾遗 第 5 章 语句
Notes Cpp Primer
Lastmod: 2021-06-01 周二 22:40:33

第 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* 用来提供错误信息的文本。

Prev: 《C++ Primer》 拾遗 第 4 章 表达式
Next: 《C++ Primer》 拾遗 第 6 章 函数