C++语句
# 语句
# 介绍
C++的语句大多数都是以分号结束,用以分隔多条语句。虽然多条语句可以写在一行,但为了提高代码可读性,一般是每行只写一条语句。 一般情况下,语句是顺序执行的,但在大多数情况下,顺序执行并不能满足使用,因此就需要有控制流语句以支持更复杂的执行路径。
# 空语句
最简单的语句是空语句,就只有一个分号";"。空语句一般用于占位,使用空语句应该加上注释,以表示该语句是有意省略的。 例如:
; // 我是一条空语句
# 复合语句
复合语句又称为块,它是用花括号括起来的语句和说明的序列,用于逻辑上需要多条语句的地方,例如判断、循环等,一个块就是一个作用域。 例如:
// 只需要执行一条语句则可以不用复合语句。
if (1 == 1) cout << "yes" << endl;
// 想要执行多条语句就需要使用复合语句。
if (1 == 1){
cout << "yes" << ends;
cout << "i do." << endl;
}
2
3
4
5
6
7
8
在判断、循环等地方,即便只执行一条语句,也建议使用花括号,这样可以使代码更清晰明确。
# 条件语句
# if语句
格式:
// 单分支
if(condition)
statement
// 双分支
if(condition)
statement1
else
statement2
// 多分支
if(condition1)
statement1
else if(condition2) // 可有多个else if
statement2
else // 可选else
statement3
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# switch语句
格式:
switch(expression){
// 如果expression的值等于value则会执行,需要加break跳出switch,否则会继续执行后续case中的代码,直到swtich结尾或遇到break。
case value1:
statement1
break;
// 可有多个case。
case value2:
statement2
break;
// 对于匹配值不同,但执行代码相同,可以用如下写法。
case value3:
case value4:
statement3
break;
// 如果要在某个case分支初始化变量,应当将变量定义在块内,以确保后面的所有case标签都在变量的作用域之外。
case value5:
{
statement4
}
break;
// default写在最下方,表示匹配任意值,也就是如果上面都没break跳出,则会无条件执行default下的代码块。
default:
statement5
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 循环语句
# while语句
格式:
while(condition)
statement
2
# 传统for语句
格式:
for(init-statement; condition; expression)
statement
2
# 范围for语句
格式:
for(declaration : expression)
statement
2
# do while语句
格式:
do
statement
while (condition);
2
3
# 跳转语句
# break语句
break用于跳出离该语句最近的while、do while、for、switch语句。
# continue语句
break用于本次跳过离该语句最近的循环。
# goto语句
都不推荐,就不说了。
# return语句
跳出语句所在函数返回指定值。
# 异常处理语句
# 介绍
异常是程序运行时的反常行为,这些行为超出了函数正常功能的范围。而异常处理语句可以检测此类反常行为,并针对不同反常行为进行不同的处理。 异常处理机制包含异常检测和异常处理两方面,异常检测使用throw表达式,异常处理使用try-catch语句块。
# throw表达式
throw表达式用于引发(raise)异常。在我们的程序遇到某些无法处理的情况时,就可以使用throw表达式来抛出一个异常来表示。例如我们的函数需要一个大于10的整数值,但是传进了一个小于10的值,此时就可以使用throw来引发一个异常。
throw表达式的格式为:throw 异常类型("异常信息");
例如:
if(item1.isbn() != item2.isbn()){
throw runtime_error("Data must refer to same ISBN");
}
2
3
# try-catch语句块
try-catch语句块用于捕获抛出的异常并进行对应的处理。
函数抛出异常后会中断程序的正常流程,程序会从内往外查找是否有匹配的catch子句。如果内层函数找到了匹配的catch子句就会执行相应的处理代码,函数会继续执行。如果内层函数没有找到匹配的catch子句,函数会终止执行,并迭代往外层函数查找。
如果没有找到任何匹配的catch子句,程序就会转到名为terminate的标准库函数,执行该函数将导致程序非正常退出。
try-catch的格式为:
try{
program-statements
}catch (exception-declaration){
handler-statements
}catch (exception-declaration){
handler-statements
} // ...
2
3
4
5
6
7
# 标准异常
C++标准库定义了一组异常类,用于报告标准库函数遇到的问题。这些标准库异常类也可以在用户编写程序时使用。
C++标准库异常类定义在4个头文件中:
<exception>
定义了最通用的exception异常类型,它能匹配任何异常,但不能提供任何额外信息。<new>
定义了bad_alloc异常类型。<type_info>
定义了bad_cast异常类型。<stdexcept>
定义了几种常用的异常类型,如下表所示。
异常类型 | 作用 |
---|---|
exception | 最通用的异常类型 |
runtime_error | 只有在运行时才能检测出的问题 |
range_error | 运行时错误:生成的结果超出了有意义的值范围 |
overflow_error | 运行时错误:计算上溢 |
underflow_error | 运行时错误:计算下溢 |
logic_error | 程序逻辑错误 |
domain_error | 逻辑错误:参数对应的结果值不存在 |
invalid_argument | 逻辑错误:无效参数 |
length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
out_of_range | 逻辑错误:使用一个超出有效范围的值 |
对于exception、bad_allloc、bad_cast异常类型,我们只能使用默认初始化,不能允许指定初始值,也就是不能提供额外的信息。 其他类型则恰恰相反,必须使用string对象或C风格字符串初始化来提供异常信息,不允许使用默认初始化。