- #1.简单语句
- #2.语句作用域
-
#3.条件语句
- 3.1 if语句
- 3.2 switch语句
-
#4.迭代语句
- 4.1 while语句
- 4.2 传统的for语句
- 4.3 范围for语句
- 4.4 do while语句
-
#5.跳转语句
- 5.1 break语句
- 5.2 continue语句
- 5.3 goto语句
-
#6.TRY语句块和异常处理
- 6.1 throw表达式
- 6.2 try语句块
- 6.3 标准异常
#1. 简单语句
C++语言中大多数语句都以分号结束,一个表达式,末尾加上分号就变成了表达式语句。
空语句
最简单的语句就是空语句,空语句中只含有一个单独的分号:
; //空语句
别漏写分号,也别多写分号
因为空语句是一条语句,所以可以用在任何允许使用语句的地方。
int v1 = 1,v2 = 2,ival;
ival = v1 + v2;; //正确:第二个分号表示一条多余的空语句
复合语句(块)
复合语句是指用花括号括起来的语句和声明的序列,复合语句也被称为块。
#2. 语句作用域
可以在if、switch、while和for语句的控制结构中定义变量。定义在控制结构当中的变量只在相应的语句的内部可见,一旦语句结束,变量也就超出其作用范围了:
while(int i = get_num()) { //每次迭代时创建并初始化i
cout << i << endl;
}
i = 0; //错误:在循环体外部无法访问i
#3. 条件语句
C++语言提供了两种按条件执行的语句。一种是if语句,它根据条件决定控制流;另外一种是switch语句,它计算一个整形表达式的值,然后根据这个值从几条执行路径中选择一条。
3.1 if语句
if语句的作用是:判断一个指定的条件是否为真,根据判断的结果决定是否执行另外一条语句。if语句包括两种形式:一种含有else分支,另外一种没有。简单if语句的语法形式是:
if(condition)
statement
if else语句的形式是:
if(condition)
statement
else
statement2
3.2 switch语句
switch语句提供了一条便利的途径使得我们能够在若干固定选项中做出选择。
#4. 迭代语句
迭代语句通常称为循环,它重复执行操作直到满足某个条件才停下来。while和for语句在执行循环体前检查条件,do while语句先执行循环体,然后再检查条件。
4.1 while语句
只要条件为真,while语句就重复地执行循环体,它的语法形式是:
while(condition)
statement
==定义在while条件部分或者while循环体内的变量每次迭代都经历从创建到销毁的过程。==
使用while循环
当不确定到底迭代多少次时,使用while循环比较合适。
vector<int> v;
int i;
//重复读入数据,直至到达文件末尾或者遇到其他输入问题
while(cin >> i) {
v.push_back(i);
}
auto beg = v.begin();
while(beg != v.end() && *beg >= 0) {
++beg;
}
if(beg == v.end) {
...
}
4.2 传统的for语句
for语句的语法形式:
for(init-statement;condition;expression) {
statement;
}
传统for循环的执行流程
以下面的for循环为例:
for(decltype(s.size()) index = 0;index != s.size() && !isspace(index);++index) {
s[index] = toupper(s[index]); //将当前的字符改成大写形式
}
求值的顺序如下所示:
- 循环开始,首先执行一次init-statement。此例中,定义index并初始化为0。
- 接下来判断condition。如果index不等于s.size()而且在s[index]位置的字符不是空白,则执行for循环体的内容。否则,循环终止。如果第一次迭代时条件为假,for循环体一次也不会执行。
- 如果条件为真,执行循环体。此例中将s[index]位置的字符改写成大写形式。
- 最后执行expression。此例中,将index的值加1。
4.3 范围for语句
C++11新标准引入了一种更简单的for语句,这种语句可以遍历容器或其他序列的所有元素。范围for语句的语法形式是:
for(declaration:expression)
statement
expression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或者vector或string等类型的对象,这些类型的共同特点是能返回迭代器的begin和end成员。
declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符。
vector<int> ivec = {0,1,2,3,4,5};
for(auto &r : ivec) {
r *= 2; //对于ivec中的每一个元素
}
4.4 do-while语句
do-while语句和while语句非常相似,唯一的区别是,do-while语句先执行循环体后检查条件。不管条件的值如何,都至少执行一次循环。do-while语句的语法形式如下所示:
do
statement
while(condition);
#5. 跳转语句
跳转语句中断当前执行的过程。C++语言提供了4种跳转语句:break、continue、goto和return。
5.1 break语句
break语句负责终止离它最近的while、do-while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。
5.2 continue语句
continue语句终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for、while和do-while循环的内部,或者嵌套在此类循环里的语句或块的内部。
string buf;
while(cin >> buf && !buf.empty()) {
if(buf[0] != '_')
continue; //接着读取下一个输入
}
5.3 goto语句
goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句。goto语句的语法形式:
goto label;
其中,label是用于标识一条语句的标示符。带标签语句是一种特殊的语句,在它之前有一个标示符以及一个冒号:
end:return; //带标签语句,可以作为goto的目标
#6. try语句块和异常处理
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。在C++语言中,异常处理包括:
- throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。即throw引发了异常。
- try语句块,异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch字句结束。try语句块中代码抛出的异常通常会被某个catch字句处理。因此catch字句处理异常,所以它们也被称作异常处理代码。
- 一套异常类,用于在throw表达式和相关的catch字句之间传递异常的具体信息。
6.1 throw表达式
程序的异常检测部分使用throw表达式引发一个异常。
if (item.isbn() != item2.isbn()) {
throw runtime_error("Data must refer to same ISBN");
}
6.2 try语句块
try语句块的通用语法形式是:
try{
//program-statements
}catch(exception-declaration){
//handler-statements
}catch(exception-declaration){
//handler-statements
}
6.3 标准异常
C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,它们分别定义在4个头文件中:
- exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外的信息。
- stdexcept头文件定义了几种常用的异常类。
- new头文件定义了bad_alloc异常类型。
- type_info头文件定义了bad_cast异常类型。