5.1 简单语句
- 表达式语句:一个表达式末尾加上分号,就变成了表达式语句。
- 空语句:只有一个单独的分号。
- 复合语句(块):用花括号{ } 包裹起来的语句和声明的序列。一个块就是一个作用域。
5.2 条件语句
if-else语句中,else匹配离它最近且尚未配对的if。
switch语句中,case标签必须是整型常量表达式。
注:如果需要为某个case分支 定义并初始化一个变量, 我们应该把变量定义在块内,从而确保后面的所有case标签 都在变量的作用域之外。
case true : { // 正确: 声明语句位于语句块内部 string file_name = get_file_name(); } break; case false: if(file_name.empty()) // 错误: file_name不在作用城之内
建议:
- 尽管switch语句不是非得在最后一个标签后面写上break,但是为了安全起见,最好这么做。因为这样的话,即使以后再增加新的case分支,也不用再在前面补充break语句了。
- 即使不准备在 default标签 下做任何工作,定义一个default标签也是有用的。其目的在于告诉程序的读者,我们已经考虑到了默认的情况,只是目前什么也没做。
5.3 迭代语句
- while:当不确定到底要迭代多少次时,使用 while循环比较合适。(比如读取输入的内容)
- for: for语句可以省略掉 init-statement, condition和 expression的任何一个;甚至全部。
- 范围for: for (declaration: expression) statement
注:和其他的声明一样,init-statement 也可以定义多个对象。但是init-statement只能有一条声明语句,因此,所有变量的基础类型必须相同
5.4 跳转语句
- break:break语句负责终止离它最近的while、do while、for或者switch语句,并从这些语句之后的第一条语句开始继续执行。
- continue:终止最近的循环中的当前迭代 并立即开始下一次迭代。只能在while、do while、for循环的内部。
- goto:goto语句无条件跳转到同一函数内的另一条语句。
goto语句的语法形式:goto labellabel是用于标识一条语句的标识符
注:标签标示符 独立于变量或其他标示符的名字。因此,标签标示符可以和程序中其他实体的标示符使用同一个名字而不会相互干扰。(goto语句和标签必须位于同一函数内)
建议:不要在程序中使用goto语句,因为它使得程序既难理解又难修改。
5.5 try语句块和异常处理
- throw表达式:异常检测部分使用 throw表达式来表示它遇到了无法处理的问题。throw引发了异常。
- try语句块:try语句块以关键字try开始,并以一个或多个catch子句结束。 try语句块中的代码抛出的异常通常会被某个 catch捕获并处理。 catch子句也被称为异常处理代码。
- 异常类:用于在 throw表达式和相关的 catch子句之间传递异常的具体信息。
C++异常类定义在4个头文件中:
- exception头文件:定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息。
- stdexcept 头文件:定义了几种常用的异常类。
- new头文件:定义了bad_ alloc异常类型。
- type_ info头文件:定义了bad_ cast异常类型。
定义的异常类 | |
exception | 最常见的问题 |
runtime_error | 只有在运行时才能检测出的问题 |
range_error | 运行时错误:生成的结果超出了有意义的值域范围 |
overflow_error | 运行时错误:计算上溢 |
underflow_error | 运行时错误:计算下溢 |
logic_error | 程序逻辑错误 |
domain_error | 逻辑错误:参数对应的结果值不存在 |
invalid_argument | 逻辑错误:无效参数 |
length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
out_of_range | 逻辑错误:使用一个超出有效范围的值 |
注:
- 我们只能以 默认初始化 的方式初始化exception、bad_ alloc和bad_ cast 对象,不允许为这些对象提供初始值。
- 恰恰相反,其他异常类型应该使用 string对象或者C风格字符串 初始化这些类型的对象,但是不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值,该初始值含有错误相关的信息。
- 异常类型 只定义了一个名为what 的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*。(提供关于异常的一些文本信息)