1. 空块的作用等价于空语句。
  2. case标签必须是整型常量表达式,default也是一种特殊的case标签。
  3. 标签不应该孤零零地出现,它后面必须跟上一条语句或者另外一个case标签。
  4. 如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。
      case true:
    // 因为程序的执行流程可能绕开下面的初始化语句,所以该switch语句不合法
    string file_name; // 错误:控制流绕过一个隐式初始化的变量
    int ival = 0; // 错误:控制流绕过一个显式初始化的变量
    int jval; // 正确:因为jval没有初始化
    break;
    case false:
    // 正确:jval虽然在作用域内,但是它没有被初始化
    jval = next_num(); // 正确:给jval赋一个值
    if (file_name.empty()) // file_name在作用域内,但是没有被初始化
    // ...
  5. 如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外(变量的作用域在花括号内)。
      case true:
    {
    // 正确:声明语句位于语句块内部
    string file_name = get_file_name();
    // ...
    }
    break;
    case false:
    if (file_name.empty()) // 错误:file_name不在作用域之内
  6. 定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程(while内定义的变量只在while内有效)。
  7. 牢记for语句头中定义的对象只在for循环体内可见。
  8. do-while:作为循环的条件,不能定义在do的内部
  9. 不要在程序中使用goto语句,因为它使得程序既难理解又难修改。
  10. 标签标志符独立于变量或其它标志符的名字,因此,标签标志符可以和程序中其他实体的标志符使用同一个名字而不会相互干扰。goto语句和控制权转向的那条带标签的语句必须位于同一个函数之内
  11. 和switch语句类似,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内:
      // ...
    goto end;
    int ix = 10; // 错误:goto语句绕过了一个带初始化的变量定义(此处是ix作用域开始的地方)(如果写成`int ix;`正确)
    end:
    // 错误:此处的代码需要使用ix,但是goto语句绕过了它的声明
    ix = 42;
  12. 向后跳过一个已经执行的定义是合法的。跳回到变量定义之前意味着系统将销毁该变量,然后重新创建它。
      // 向后跳过一个带初始化的变量定义是合法的
    begin:
    int sz = get_size();
    if (sz <= 0)
    {
    goto begin;
    }
  13. throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发了异常。例:throw runtime_error("Data must refer to same ISBN");
  14. try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称作异常处理代码。
  15. 一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息。
  16. try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问(作用域仅限在该花括号内)。
      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循环
    }
    }
  17. 寻找处理代码的过程与调用链刚好相反。当异常被抛出时,首先搜索抛出该异常的函数。如果没找到匹配的catch子句,终止该函数、并在调用该函数的函数中继续寻找。如果还是没有找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止。如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。对于那些没有任何try语句块定义的异常,也按照类似的方式处理:毕竟,没有try语句块也就意味着没有匹配的catch子句。如果一段程序没有try语句块且发生了异常,系统会调用terminate函数并终止当前程序的执行。
  18. 异常中断了程序的正常流程。
  19. 我们只能以默认初始化的方式初始化exceptionbad_allocbad_cast对象,不允许为这些对象提供初始值。其他异常类型的行为则恰好相反:应该使用string对象或者C风格字符串初始化这些类型的对象,但是不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值,该初始值含有错误相关的信息。

《C++ Primer》笔记 第5章 语句的更多相关文章

  1. 《C++ Primer 4th》读书笔记 第6章-语句

    原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3912407.html

  2. C++ Primer 笔记 第三章

    C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 ...

  3. C++ Primer 5th 第5章 语句

    和大多数语言一样,C++提供了条件执行语句.重复执行相同代码的循环语句和由于中断当前控制流的跳转语句,表达式语句和声明语句等. 语句有简单语句和复合语句之分.简单语句但多数以分号结束,最简单的语句就是 ...

  4. 《Pointers On C》读书笔记(第四章 语句)

    1.空语句只包含一个分号,它本身并不执行任何任务,其适用的场合是语法要求出现一条完整的语句,但并不需要它执行任何任务. 2.C语言中并不存在专门的“赋值语句”,赋值就是一种操作,在表达式内进行.通过在 ...

  5. C Primer Plus_第5章_运算符、表达式和语句_编程练习

    Practice 1. 输入分钟输出对应的小时和分钟. #include #define MIN_PER_H 60 int main(void) { int mins, hours, minutes; ...

  6. <<C++ Primer>> 第 5 章 语句

    术语表 第 5 章 语句 块(block): 包围在花括号内的由 0 条或多条语句组成的序列.块也是一条语句,所以只要是能使用语句的地方,就可以使用块.    break语句(break statem ...

  7. C Primer Plus_第6章_循环_编程练习

    1.题略 #include int main(void) { int i; char ch[26]; for (i = 97; i <= (97+25); i++) { ch[i-97] = i ...

  8. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  9. 《SQL CookBook 》笔记-第三章-多表查询

    目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...

随机推荐

  1. poj 3304 Segments(解题报告)

    收获:举一反三:刷一道会一道 1:思路转化:(看的kuangbin的思路) 首先是在二维平面中:如果有很多线段能够映射到这个直线上并且至少重合于一点,充要条件: 是过这个点的此条直线的垂线与其他所有直 ...

  2. Python:装饰器是如何调用的

    应用举例:(1)装饰器 # 装饰器的调用: # 一旦用上装饰器会: # 第一步:调outer函数 # 第二步:被装饰的函数play_game会被当作参数fn给outer # 第三步:最后调用play_ ...

  3. k8s二进制部署 - traefik安装

    配置traefik资源清单rbac.yaml 配置traefik资源清单 rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: t ...

  4. 【原创】k8s之job和Cronjob

    1.失败任务 apiVersion: batch/v1 kind: Job metadata: name: bad spec: template: metadata: name: bad spec: ...

  5. zhihu level

    zhihu level https://www.zhihu.com/creator/account/growth-level refs xgqfrms 2012-2020 www.cnblogs.co ...

  6. js 十大排序算法 All In One

    js 十大排序算法 All In One 快速排序 归并排序 选择排序 插入排序 冒泡排序 希尔排序 桶排序 堆排序(二叉树排序) 基数排序 计数排序 堆排序(二叉树排序) https://www.c ...

  7. Swift private(set) All In One

    Swift private(set) All In One SwiftUI Getters and Setters https://docs.swift.org/swift-book/Language ...

  8. How to Use RSS on Your Website

    RSS feed 1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  9. W3C & 弹幕

    W3C & 弹幕 弹幕用例规范 Draft Community Group Report 21 August 2020 refs https://w3c.github.io/danmaku/u ...

  10. leetcode solution cracked tutorial

    leetcode solution cracked tutorial problemset https://leetcode.com/problemset/all/ Top Interview Que ...