本章讲解C++ 语言的语句,主要有条件执行语句,重复执行相同代码的循环语句和用于中断当前控制流的跳转语句。
通常情况下,语句是顺序执行的。所以C++ 提供了一组控制流语句以支持更复杂的执行路径。
1 简单语句
一个表达式,末尾加上分号,就是一个表达式语句。其作用是执行表达式并丢弃求值结果。
空语句:只含有一个单独的分号。用于语法上需要一条语句但是逻辑上不需要,如一个while 循环的全部工作在条件部分就可以完成时。使用空语句应该添加注释,让人知道该语句是有意省略。
复合语句;花括号括起来的语句和声明的序列,也称块。在块中引入的名字只能在块内部及嵌套在块中的子块里访问。
2 条件语句
C++ 有两种按条件执行的语句。一是if 语句,一是switch 语句。
if 语句经常会嵌套使用,有时无法一眼看出if 与 else 的匹配关系,最好用花括号括起来,控制执行路径。if 常用,就不举例。
switch 语句提供了一种便利的途径使我们能在若干固定选项中做出选择。如统计字符出现次数:
unsigned aCnt = 0, bCnt = 0;
char ch;
while (cin >> ch)
{
switch (ch)
{
case 'a' : ++aCnt;
break;
case 'b' : ++bCnt;
break;
default : break;
}
}
case 标签必须是整形常量表达式,且任两个case 标签值不能相同。
break 语句一般不能省略,如果没写,最好写代码注释一下原因。
最好有default 哪怕什么也没做。
3 循环语句
C++ 主要有while for 和do while 三种循环语句。
while 定义在while 条件部分或循环体内的变量每次迭代都经历从创建到销毁的过程。当不确定循环次数时,使用while 循环比较合适。
for 牢记for 语句头中定义的对象只在for 循环体中可见。C++11引入了一种范围for 语句,可以遍历容器(string vector等)或其他序列的所有元素,因为他们能返回迭代器的begin 和end 成员。如:
vector<int> v={0,1,2,3,4,5};
for (auto &r : v)
r *= 2;
do while 与while 非常类似,不同之处在于do while 不管条件的值如何,至少执行一次循环,如:
string rsp; // 定义在循环外部
do
{
cout<<"please enter two values: ";
int v1 = 0, v2 = 0;
cin>>v1>>v2;
cout<<"the sum of "<<v1<<" and "<<v2
<<" = "<<v1+v2<<"\n"
<<"More? Enter yes or no: ";
cin>>rsp;
} while (!rsp.empty() && rsp[0] != 'n');
C++ 有四种跳转语句:break ,continue ,goto 和return。
break 负责终止离他最近的while,do while,for,switch语句,并从这些语句之后的第一条语句开始执行。
continue 终止最近的循环中的当前迭代,并立即开始下一次迭代。
goto 无条件跳转到同一函数内的另一条语句。不要使用goto,它使程序既难理解又难修改。
5 异常处理语句
异常指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。
当程序的某部分检测到一个无法处理的问题时,需要用到异常处理。
C++ 中异常处理包括:
throw 表达式,异常检测使用它来表示遇到了异常。
try catch 语句块,try 语句块中的抛出的异常被catch 子句处理。
异常类,用于在throw 表达式和相关的catch 子句之间传递异常的具体信息。
结构如:
while (cin>>v1>>v2)
{
try
{
if (v1 == v2)
throw runtime_error("Data is same");
cout<<v1<<v2;
} catch (runtime_error err)
{
cout<<err.what()
<<"\nTry again? Enter y or n"<<endl;
char c;
cin>>c;
if (!cin || c == 'n')
break;
}
}
当异常被抛出时,首先搜索抛出该异常的函数,如果没有找到匹配的catch 子句,终止该函数,并在调用该函数的函数中继续寻找,沿着程序执行的路径逐层回退,直到找到适当类型的catch 子句。如果最终还没找到,程序转到名为terminate 的标准库函数。一般会导致程序非正常退出。
异常中断了程序的正常流程。
对一些程序来说,异常发生时只是简单地终止程序。但对于确实要处理异常并且继续执行的程序,要加倍注意。必须时刻清楚异常何时发生,异常发生后如何确保对象有效,资源无泄漏,程序处于合理状态等。