5.1 简单语句
末尾加上分号就变成了表达式语句,表达式语句的作用是执行表达式并丢弃掉求值结果。
空语句
空语句只有一个单独的分号。使用空语句的时候应该加上注释,从而令读这段代码的人知道该语句是有意省略的。
别漏写和多写分号
多余的空语句无害,但是if和while后面的分号可能改变程序员的初衷。
while(iter != svec.end()) ; //while循环体是那条空语句
复合语句
复合语句是指用花括号括起来的语句和声明序列,复合语句也称为块。块不以分号作为结束。
5.2语句作用域
可以在if、switch、while和for语句控制结构内定义变量,定义在控制结构的变量,只能在相应的语句的内部可见。
5.3条件语句
5.3.1 if 语句
if语句判断一个指定的条件是否为真,根据判断结果决定是否执行另外一条语句。
悬垂else
当一个if语句嵌套在另外一个if语句的内部时,很可能if分支会多余else分支,else与离他最近的尚未匹配的if匹配。
5.3.2switch语句
switch语句提供了在多个选项中进行选择的便利。
如果表达式和某个case标签的值匹配成功,程序从该标签之后的第一条语句开始执行,直到到达switch的结尾或者是遇到break语句为止。
如果switch语句和所有的case都匹配不上,将直接跳到switch结构之后的第一条语句。
case关键字和它对应的值一起被称为case标签,case标签必须是整形常量表达式,且任何两个case标签的值不能相同。
cpp
char ch = getVal();
int val = 42;
switch(ch){
case 3.14: //错误,不是整数
case val : //错误,不是常量表达式
}
switch内部的控制流
cpp
switch(ch)
{
case 'a': case 'b':
++val
break;
}
switch内部的变量定义
如果程序跳到了某个特定的case,则switch中该case标签之前的部分会忽略掉。
5.4迭代语句
5.4.1 while语句
while(condition)
statement;
5.4.2 传统的for语句
for(init-statement;condition;expression)
init-statement可以定义多个对象,但只能有一条声明语句
for(int i=0,j=i;i !=sz; ++i)
5.4.3范围for循环
范围for语句
for(declaration:expression)
statement
declaration定义一个变量,序列中的每个元素都能转化成该变量的类型,确保类型相容最简单的办法是使用auto类型。
cpp
vector<int> v= {0,1,2,3,4,5};
for (auto &r:v)
r*=2;
5.6 try 语句块和异常处理
异常处理机制为程序中异常检测和异常处理这两部分的协作提供了支持。C++中的异常处理包括:
1.throw 表达式,异常检测部分使用throw表达式表示它遇到了无法处理的问题,
2.try语句块,异常处理部分使用try语句块处理异常。try语句块以try开始,并以一个或多个catch子句结束。
3.一套异常类。用于在throw表达式和catch子句之间传递异常的具体信息。
5.6.1throw表达式
throw后面紧跟一个表达式。
throw runtime_error("data not find");
runtime_error是标准异常库的一种,在stdexcept头文件中。
5.6.2try语句库
cpp
try{
} catch(exception-declaration){
}catch(exception-declaration){
}
try之后跟着一个或多个catch子句,catch子句包含三部分,关键字catch、括号内的对象声明和一个块。
try中的内容,catch中也无法访问。
每个标准的异常类都定义了名为what的成员函数。返回c风格字符串。
如果异常最终没有找到任何catch子句,程序直接跳转到名为terminate的标准库函数。导致程序非正常退出。
5.6.3标准异常
C++标准库定义了一组类,可以在用户编写的程序中使用,分别定义在4个头文件中。
1.exception头文件定义了最通用的exception.它只报告异常发生,不提供任何额外的信息。
2.stdexcept头文件定义了集中常用异常。
3.new头文件定义了bad_alloc异常类型
4.type_info头文件定义了bad_cast异常类型。
stdexcept头文件的异常类型
exception 最常见的异常
runtime_error 允许时检测的异常
overflow_error 运行时错误:计算上溢
underflow_error 运行时错误:计算下溢
logic_error 程序逻辑错误
domain_error 逻辑错误:参数对应的结果值不存在
invalid_argument 逻辑错误:无效参数
length_error 逻辑错误:试图创建一个超出该类型最大程度的对象
out_or_range 逻辑错误:使用是一个超出有效范围的值
只能以默认初始化的方式初始化exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值。
其他异常类型应该使用string或者C风格字符串初始化这些类型的对象,不允许使用默认初始化的方式。
异常类型只定义了一个what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*.