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. Educational Codeforces Round 20

    Educational Codeforces Round 20  A. Maximal Binary Matrix 直接从上到下从左到右填,注意只剩一个要填的位置的情况 view code //#pr ...

  2. Java 窗口 小马图像窗口

    写在前面: eclipse接着爽到 全是借鉴的,东改西改,而且记不住原网址了 两个月前写的,忘了思路,嗯,It just works 运行效果: 图像随便选(放到*jar所在目录*\\pictures ...

  3. Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) D. Divide and Sum (思维,数学,逆元)

    题意:有一个长度为\(2n\)数组,从中选分别选\(n\)个元素出来组成两个序列\(p\)和\(q\),(\(p\)和\(q\)中只要有任意一个元素在\(a\)的原位置不同,就算一个新的情况),选完后 ...

  4. c语言中qsort函数的使用、编程中的一些错误

    qsort()函数: 功能:相当于c++sort,具有快排的功能,复杂度的话nlog(n)注:C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法.两者的时间复杂度都是nlog ...

  5. 使用networkx库可视化对称矩阵的网络图形

    首先我的数据是.mat格式,讲讲如何用python读取.mat格式的数据(全套来) 我是python3版本 第一种读取方法: import h5py features_struct = h5py.Fi ...

  6. mysql-画图

    目录 阿里数据库产品rds 淘宝数据库架构 数据库下载 Mysql3种安装方法 mysql_install_db安装数据库命令脚本中有生成初始mysql数据 也可以把mysql_install_db集 ...

  7. Operating System:信号量

    pv原语操作(1)操作系统PV意思:PV操作与信号量的处理相关,P表示通过的意度思,V表示释放的意思.(2)p操作和v操作是不可中断问的程序段,称为原语.如果将信号量看作共享变量,则pv操作为其临界区 ...

  8. 图解算法——KMP算法

    KMP算法 解决的是包,含问题. Str1中是否包含str2,如果包含,则返回子串开始位置.否则返回-1. 示例1: Str1:abcd123def Str2:123d 暴力法: 从str1的第一个字 ...

  9. JVM终结篇

    1.1 重新认知JVM 之前我们画过一张图,是从Class文件到类装载器,再到运行时数据区的过程.现在咱们把这张图不妨丰富完善一下,展示了JVM的大体物理结构图. 1.2 GC优化 内存被使用了之后, ...

  10. freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5

    最近因为工作需要用到FreeRTOS,其实开始本人内心是拒绝的因为自己只学习过UCOSIII还没实际上过什么大又复杂的工程,但是谁让FreeRTOS他是Free的呢公司成本考虑肯定是不会选择USOS的 ...