1. 空块的作用等价于空语句。
  2. case标签必须是整型常量表达式,default也是一种特殊的case标签。
  3. 标签不应该孤零零地出现,它后面必须跟上一条语句或者另外一个case标签。
  4. 如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。
    1. case true:
    2. // 因为程序的执行流程可能绕开下面的初始化语句,所以该switch语句不合法
    3. string file_name; // 错误:控制流绕过一个隐式初始化的变量
    4. int ival = 0; // 错误:控制流绕过一个显式初始化的变量
    5. int jval; // 正确:因为jval没有初始化
    6. break;
    7. case false:
    8. // 正确:jval虽然在作用域内,但是它没有被初始化
    9. jval = next_num(); // 正确:给jval赋一个值
    10. if (file_name.empty()) // file_name在作用域内,但是没有被初始化
    11. // ...
  5. 如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外(变量的作用域在花括号内)。
    1. case true:
    2. {
    3. // 正确:声明语句位于语句块内部
    4. string file_name = get_file_name();
    5. // ...
    6. }
    7. break;
    8. case false:
    9. 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语句也不能将程序的控制权从变量的作用域之外转移到作用域之内:
    1. // ...
    2. goto end;
    3. int ix = 10; // 错误:goto语句绕过了一个带初始化的变量定义(此处是ix作用域开始的地方)(如果写成`int ix;`正确)
    4. end:
    5. // 错误:此处的代码需要使用ix,但是goto语句绕过了它的声明
    6. ix = 42;
  12. 向后跳过一个已经执行的定义是合法的。跳回到变量定义之前意味着系统将销毁该变量,然后重新创建它。
    1. // 向后跳过一个带初始化的变量定义是合法的
    2. begin:
    3. int sz = get_size();
    4. if (sz <= 0)
    5. {
    6. goto begin;
    7. }
  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子句内也无法访问(作用域仅限在该花括号内)。
    1. while (cin >> item1 >> item2)
    2. {
    3. try
    4. {
    5. // 执行添加两个Sales_item对象的代码
    6. // 如果添加失败,代码抛出一个runtime_error异常
    7. }
    8. catchruntime_error err
    9. {
    10. // 提醒用户两个ISBN必须一致,询问是否重新输入
    11. cout << err.what();
    12. << "\nTry Again? Enter y or n" << endl;
    13. char c;
    14. cin >> c;
    15. if (!cin || c == 'n')
    16. break; // 跳出while循环
    17. }
    18. }
  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. 阅读笔记:Item-based Collaborative Filtering Recommendation Algorithms

    概要: 推荐系统通过信息获取技术解决在线的个人的消息.产品或者服务的推荐问题.这些系统,特别是基于k临近协同过滤算法,在网络上取得了广泛的成功.可用信息和访问人数的巨大增加成了推荐系统一个难题.基于商 ...

  2. hdu5135 Little Zu Chongzhi's Triangles

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submissi ...

  3. PowerShell随笔1---背景

    既然是随笔,那就想到什么说什么,既会分享主题知识,也会分享一些其他技巧和个人学习方法,供交流. 我一般学习一个东西,我都会问几个问题: 这东西是什么? 这东西有什么用,为什么会出现,出现是为了解决什么 ...

  4. 【非原创】sg函数模板

    学习博客:戳这里 解题模型: 1.把原游戏分解成多个独立的子游戏,则原游戏的SG函数值是它的所有子游戏的SG函数值的异或.        即sg(G)=sg(G1)^sg(G2)^...^sg(Gn) ...

  5. 电影推荐系统---协同过滤算法(SVD,NMF)

    SVD 参考 https://www.zybuluo.com/rianusr/note/1195225 1 推荐系统概述   1.1 项目安排     1.2 三大协同过滤   1.3 项目开发工具 ...

  6. mysql(五)--性能优化总结

    1 优化思路 作为架构师或者开发人员,说到数据库性能优化,你的思路是什么样的? 或者具体一点,如果在面试的时候遇到这个问题:你会从哪些维度来优化数据库, 你会怎么回答? 我们在第一节课开始的时候讲了, ...

  7. SSL 数据加密原理简述

    最近调试mqtt协议,为了保证数据安全性和将来客户端的对云的兼容性选择了openssl作为安全加密中间层,而没有使用私有的加密方式.所以花了点时间学习了一下ssl 加密流程整理如下: 因为正常正式使用 ...

  8. 图解 git stash

    图解 git stash # 暂存本地 变化 $ git stash # 复原 $ git stash pop The "git stash" command can help y ...

  9. .NET & C# & ASP.NET

    .NET && C# && ASP.NET https://docs.microsoft.com/zh-cn/dotnet/ .NET Documentation We ...

  10. Immutable.js 实现原理

    Immutable.js 实现原理 Immutable collections for JavaScript v4.0.0-rc.12 released on Oct 31, 2018 https:/ ...