目录
5.1 简单语句
- 空语句:只有一个分号占位;
- 复合语句(块):用花括号括起来的语句和声明的序列,一个块就是一个作用域,在块中引入的名字只能在块内部以及嵌套在块中的子块访问;
5.2 语句作用域
在if、switch、while和for语句的控制结构内定义变量,该变量只在相应语句的内部可见。
5.3 条件语句
5.3.1 if语句
悬垂else:在有多个无匹配的if的情况中,else与离它最近的无匹配的if匹配
5.3.2 switch语句
case标签必须是整型常量表达式,某个case标签匹配成功将从该标签开始往后顺序执行所有case分支,因此必须添加break中断当前的控制流 :
当希望多个case标签共享同一组操作时,可以省略掉break语句:
如果没有任何一个case标签能够匹配switch表达式的值,程序会执行default标签后面的语句
5.4 迭代语句(循环)
5.4.1 while语句
当不确定迭代具体次数可以使用while循环
5.4.2 for语句
for语句头可以省略三个元素:省略第二个元素的时候需要额外设置退出循环的语句
5.4.3 范围for语句
用于遍历容器或其他序列的所有元素:
- expression表示的必须是一个序列(花括号括起来的初始值列表、vector对象、string对象......这些类型的共同特点是拥有能返回迭代器的begin和end成员) ;
- declaration定义一个变量,序列中的每个元素都能转换成该类型的变量(最简单的办法是使用auto类型说明符);
r必须是引用类型才能对元素执行写操作。
5.4.4 do while语句
5.5 跳转语句
5.5.1 break语句
- 终止离他最近的while,do...while,for或switch语句,并从这些语句之后的第一条语句开始执行
- 只能终止while,do...while,for或switch语句
5.5.2 continue语句
- 终止最近的循环中的当前迭代并立即开始下一次迭代
- 只能出现在while,do...while,for循环的内部
5.5.3 goto语句
- 从goto语句无条件跳转到同一函数内的另一条语句
- 不要使用
5.6 try语句块和异常处理
异常处理机制:
- throw表达式:异常检测部分使用throw表达式表示遇到了无法处理的问题;
- try语句块:异常处理部分,以关键字try开始并以一个或多个catch子句结束,try语句块中代码抛出的异常通常会被某个catch子句处理;
- 异常类:在throw表达式和相关的catch子句之间传递异常的具体信息;
5.6.1 throw表达式
图书管理系统中如果isbn码不一致则抛出异常:
5.6.2 try语句块
exception-declaration:异常声明,当选中了某个catch子句处理异常之后,执行与之对应的块。
以上一节的图书管理系统为例:
如果try语句块的代码抛出了runtime_error异常则执行catch块内的语句,给用户的提示信息“err.what()”是runtime_error的成员函数,返回代码抛出异常时的string对象,本节的catch语句输出如下:
5.6.3 标准异常
C++定义了一组类用于报告标准库函数遇到的问题,定义在4个头文件中:
- exception头文件定义了最通用的异常类exception,只报告异常的发生不提供任何额外信息;
- stdexcept头文件定义了几种常用的异常类,如下表所示;
- new头文件定义了exception异常类型;
- type_info头文件定义了exception异常类型;
- 以默认初始化的方式初始化exception、exception、exception对象,不允许为这些对象提供初始值;
- 其它异常类型应该使用string对象初始化这些类型的对象(不能使用默认初始化),必须提供初始值,该初始值含有错误相关的信息;
- 异常类型只定义了名为what的成员函数,没有任何参数,返回一个指向c风格字符串的const char*,提供关于异常的文本信息。如果异常类型有一个字符串初始值,what返回该字符串,对于其他无初始值的异常类型来说,what返回的内容由编译器决定。