目录

5.语句


语句

1 简单语句

  • 表达式语句:一个表达式末尾加上分号,就变成了表达式语句。
  • 空语句:只有一个单独的分号。
  • 复合语句(块):用花括号 {}包裹起来的语句和声明的序列。一个块就是一个作用域。

2 语句作用域

定义在控制结构(if、switch、while、for)当中的变量只在相应语句的内部可见。

3 条件语句

3.1 if..else

悬垂 else(dangling else):用来描述在嵌套的if else语句中,如果ifelse多时如何处理的问题。C++使用的方法是else匹配最近没有配对的if

3.2 switch

switch 语句:如果表达式和某个 case 标签的值匹配成功,就会从该标签后的第一条语句开始执行,直到到达一条 break 或最尾部。

4 迭代语句

  • while:当不确定到底要迭代多少次时,使用 while循环比较合适,比如读取输入的内容。
  • forfor语句可以省略掉 init-statementconditionexpression的任何一个;甚至全部
  • 范围 forfor (declaration: expression) statement

5 跳转语句

5.1 break

break 语句:终止与其最近的 while、do while、 for 或 switch 语句

5.1.1 continue

终止最近的循环中的当前迭代并立即开始下一次迭代

5.1.2 goto

无条件跳转到同一函数内的另一条语句

6 TRY 语句块和异常处理

运行时的反常行为。例如读取或写入数据时失去数据库连接,处理反常行为可能是设计所有系统最难的一部分。

6.1 throw 表达式

throw 表达式:异常检测部分使用 throw表达式来表示它遇到了无法处理的问题。我们说 throw引发 raise了异常。

抛出一个异常,终止当前的函数,并把控制权交给处理异常的代码。

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

include <stdexcept>

if (a != b) {
	  // 必须初始化 runtime_error 的对象,方式是给它提供一个 string 对象或者一个C凤格的字符串
    throw runtime_error("has run time error");
}

6.1.1 try 语句块

try关键词开始,以一个或多个 catch字句结束。 try语句块中的代码抛出的异常通常会被某个 catch捕获并处理。 catch子句也被称为异常处理代码

try {
    /* code */
} catch (const std::exception& e) {
    std::cerr << e.what() << '\n';
}

6.1.2 标准异常(异常类)

一套异常类:用于在 throw表达式和相关的 catch子句之间传递异常的具体信息。 这些异常类分别定义在 4 个头文件中:

  • exception 头文件: 最通用的异常类 exception,只报告异常的发生,不提供额外信息
  • stdexcept 头文件: 定义了几种常用的异常类
  • new 头文件: bad_alloc 异常类
  • type_info 头文件: bad_cast 异常类

7 小结

C++语言仅提供了有限的语句类型,它们中的大多数会影响程序的控制流程:

  • while、 for 和 do while 语句,执行迭代操作。
  • if 和 switch 语句,提供条件分支结构。
  • continue 语句,终止循环的当前一次选代。
  • break 语句,退出循环或者 switch 语句。
  • goto 语句,将控制权转移到一条带标签的语句。
  • try 和 catch,将一段可能地出异常的语句序列括在花括号里构成 try 语句块。
  • catch 子句负责处理代码抛出的异常。
  • throw 表达式语句,存在于代码块中,将控制权转移到相关的 catch 子句。
  • return 语句,终止函数的执行。我们将在第 6 章介绍 return 语句。

除此之外还有表达式语句和声明语句,表达式语句用于求解表达式,关于变量的声明和定义在第 2 章已经介绍过了。

8 术语表

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

**break 语句(break statement):**终止理他最近的循环或 switch 语句。控制权转移到循环或 switch 之后的第一条语句。

case 标签(case label): 在 switch 语句中紧跟在 case 关键字之后的常量表达式(参见 2.4.4 节,第 58 页)。在同一个 switch 语句中任意两个 case 标签的值不能相同。

**catch 子句(catch clause):**由三部分组成:catch 关键字,括号里的异常声明以及一个语句块。catch 子句的代码赋值处理异常声明中定义的异常。

复合语句(compound statement): 和块是同义词。

continue 语句(continue statement): 终止离它最近的循环的当前迭代。控制权转移到 while 或 do wihle 语句的条件部分,或者范围 for 循环的下一次迭代,或者传统 for 循环头部的表达式。

悬垂 else(dangling else): 是一个俗语,指的是如何处理嵌套 if 语句中 if 分钟多于 else 分支的情况。 C++语言规定,else 应该与前一个未匹配的 if 匹配在一起。使用花括号可以把位于内层的 if 语句隐藏起来,这样程序员就能更好地控制 else 该与那个 if 匹配。

default 标签(default label): 是一种特殊的 case 标签,当 switch 表达式的值与所有 case 标签都无法匹配时,程序执行 default 标签下的内容。

do while 语句(do while statement): 与 while 语句类似,区别是 do while 语句先执行循环体,在判断条件。循环体代码至少会执行一次。

异常类(exception class): 是标准库定义的一组类,用于表示程序发生的错误。表 5.1(第 176 页)列出了不同用途的异常类。

异常声明(exception declaration): 位于 catch 子句中的声明,指定了该 catch 子句能处理的异常类型。

异常处理代码(exception handler): 程序某处引发异常后,用于处理该异常的另一处代码。和 catch 子句是同义词。

异常安全(exception safe): 是一个术语,表示的含义是当抛出异常后,程序能执行正确的行为。

表达式语句(expression statement): 即一条表达式后面跟上一个分号,令表达式执行求值的过程。

控制流(flow of control): 程序的执行路径。

for 语句(for statement): 提供迭代执行的迭代语句。常常用于遍历一个容器或重复计算若干次。

goto 语句(goto statement): 令控制器无条件转移到同一个函数中一个指定的带标签语句。goto 语句容易造成程序的控制流混乱,应禁止使用。

if else 语句(if else statement): 判断条件,根据其结果分别执行 if 分支或 else 分支的语句。

if 语句(if statement): 判断条件,根据其结果有选择地执行语句。如果条件为真,执行 if 分支地代码;如果条件为假,控制权转移到 if 结构之后的第一条语句。

带标签语句(labeled statement): 前面带有标签的语句。所谓标签是指一个标识符以及紧跟着的一个冒号。对于同一个标识符来说,用作标签的同数还能用于其他目的,互不干扰。

空语句(null statement): 只含有一个分号的语句。

**引发(raise):**含义类似于 throw。在 C++语句中既可以说抛出异常,也可以说引发异常。

**范围 for 语句(range for statement):**在一个序列中进行迭代的语句。

switch 语句(switch statement): 一种条件语句,首先求 switch 关键字后面表达式的值,如果某个 case 标签的值与表达式的值相等,程序直接跨过之前的代码从这个 case 标签开始执行,如果有 defalut 标签,从 default 标签继续执行;如果没有,结束 switch 语句。

terminate: 是一个标准库函数,当异常没有被捕捉到时调用。terminate 终止程序的执行。

throw 表达式(throw expression): 一种中断当前执行路径的表达式。throw 表达式抛出一个异常并把控制权转移到能处理该异常的最近的 catch 子句。

try 语句块(try block): 跟在 try 关键字后面的块,以及一个或多个 catch 子句。如果 try 语句块的代码引发异常并且其中一个 catch 子句匹配该异常类型,则异常被该 catch 子句处理。否则,异常将有外围 try 语句块处理,或者程序终止。

while 语句(while statement): 只要指定的条件为真,就一直迭代执行目标语句,随着条件真值的不同,循环可能执行多次,也可能一次也不执行。