C++Primer学习笔记:第5章 语句

  • 一个表达式末尾加上分号就变成了表达式语句。最简单的语句是空语句(一个单独的分号):语法上需要一条语句但是逻辑上不需要

  • 复合语句是指用花括号括起来的(可能为空)语句和声明的序列:用在语法上需要一条语句,但是逻辑上需要多条语句的地方

  • C++规定在同一个语句块中else与离他最近的if匹配

  • case标签必须是整形常量表达式,如果某个case标签匹配成功,将从该标签开始往后顺序执行所有的case分支,除非程序显式中断,标签不应该孤零零地出现,它后面必须跟一条语句或者另外一个case标签

  • C++规定:不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。这就要求我们在case语句中不能对变量进行初始化操作(可以进行定义,定义是在编译时期发生的,所以无论如何都无法跳过,但是初始化是可以跳过的,但是这种操作是不被允许的)。

    case true:
    	string file_name;		//错误:控制流绕过一个隐式初始化的变量
    	int i = 0;				//错误:控制流绕过一个显式初始化的变量
    	int j;					//正确:没有初始化
    	break;
    case false:
    	j = 1;					//正确:j已经定义,这里是赋值
    	break;
    

    如果我们想要在case语句中定义并初始化一个变量,应该把变量定义在块内,从而确保后面所有的case标签都在变量的作用域之外

    case true:
    	{
    		string file_name;	//正确:隐式初始化
    		//...
    	}
    	break;
    case false:
    	{
    		//...
    	}
    
  • 条件部分可以是一个表达式或者是一个带初始化的变量声明

  • 定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程

  • 使用while

    • 不确定要迭代多少次
    • 想在循环结束后访问循环控制变量
  • 传统for (initializer; condition; expression) statement循环执行流程:initializer->condition->statement->expression->condition->statement->expression...

    • initializer中可以定义多个变量,但只能有一个声明语句
  • 范围for语句:

    for (declaration : expression)
    	statement
    

    expression必须是一个序列,比如:用花括号括起来的初始值列表、数组、vectorstring,共同特点是有可以返回迭代其的beginend成员

    • 不能通过范围for循环增加vector对象的元素
  • do statement while (condition)语句应该在括号包围起来的条件后用一个分号表示语句结束

    • condition使用的变量必须定义在循环体之外
  • goto语句的作用:从goto语句无条件跳转到同一函数内的另一条语句,语法形式为:

    goto label;
    

    label用于标识一条语句的标示符

    label: statement;
    

    标签标示符独立于变量或其他标示符的名字,因此标签标示符可以和程序中其他实体的标示符使用同一个名字而不会相互干扰。

    switch语句类似,goto语句也不能将程序从控制权从变量的作用域之外转移到作用域之内。向后跳过一个已经执行的定义是合法的(跳到变量定义之前意味着系统将销毁该变量然后重新创建)。感觉比较复杂也没有关系,反正不用

  • C++异常处理机制为程序中异常检测和异常处理两部分

    • throw表达式表示遇到了无法处理的问题,我们说throw引发了异常。例如:

      throw runtime_error("Data error");
      

      该异常的类型是runtime_error对象,抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码

      类型runtime_error是标准库异常类型中的一种,定义在stdexcept头文件中

    • try语句块的通用语法形式:

      try {
      	statement
      } catch (exception-delaration) {
      	handler-statement
      } ...
      

      try语句块内部声明的变量在块外无法访问,特别是在catch子句内也无法访问

      **如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。**该函数的行为与系统有关,一般情况下执行该函数将导致程序非正常退出。

      while (cin >> item1 >> item2) {
          try {
              //
          } catch (runtime_error err) {
              cout << err.what() << endl;
          }
      }
      
  • 编写异常安全的代码非常困难

    • exception头文件定义了最通用的异常类exception,只报告异常的发生,只能以默认初始化的方式初始化
    • stdexcept头文件定义了几种常用的异常类(详见P176表5.1),必须提供string对象或者C风格字符串初始化这些类型的对象
    • new头文件定义了bad_alloc异常类型,只能以默认初始化的方式初始化
    • type_info头文件定义了bad_cast异常类型,只能以默认初始化的方式初始化
    • 异常类型的what函数返回一个C风格字符串
上一篇:C++Primer学习笔记:第4章 表达式


下一篇:第十一章 高级特性-RabbitMQ TTL死信队列+延迟队列 实战