【一】语句级控制结构
语句级控制结构是控制语句执行顺序的机制。语句就是以分号分隔的一个个执行句子。
1.顺序结构
顺序结构是最基本也是最简单的语句级控制结构,也就是语句按顺序执行。c++中语句是以分号分隔开的。
2.分支结构
c++中分支结构有两种实现方式,分别是if和switch语句。
if语句又有多种形式,如下:
//第一种,当满足条件时执行语句,不满足则跳过
if(expression){
//execute statement;
...
}
//第二种,当满足条件是执行,不满足时执行else部分
if(expression){
//execute statement;
...
}else{
//execute statement;
}
//第三种,else if可以嵌套,但每一个else都必须对应一个if,在c++中,else总是对应与其最近的前一个if
if(expression){
//execute statement;
...
}else if{expression){
//execute statement;
}else{
//execute statement;
}
switch语句是通过expression的结果进行选择,执行与之匹配的value对应的case后面的语句,直到第一个break时结束,注意,如果某个case没有对应的break,那么将会继续执行下一个case,直到遇到break。
格式如下:
switch(expression){
case value1:
//execute statement;
break;
case value2:
//execute statement;
break;
....
defaule://表示没有对应expression的case时执行这个
//execute statement;
break;
}
3.循环结构
c++中循环结构有三种实现方式,分别是for,while,do/while。
for语句的执行顺序为:
①首先执行expression1,可以是任何语句,这只会被执行一次,而且一定会被执行;
②然后执行expression2语句,这一般是一个判断表达式,如果值为TRUE,则继续执行,否则跳出循环。
③第三步是执行execute statement部分的语句,
④第四步是执行expression3
⑤ 然后跳回到第②步,如此循环。
值得注意的是:这三个表达式都可以为空,若第二个表达式即判断条件为空时,只有从循环内部中断循环,如使用break跳过循环或者exit()直接结束程序等。
格式如下:
for(expression1;expression2;expression3){
//execute statement;
....
}
while语句的执行顺序为:
①执行expression,这个一般是一个判断语句,为TRUE时继续执行,否则跳出循环
②然后执行execute statement部分
③回到第①步,如此循环
while(expression){
//execute statement;
...
}
do/while语句执行顺序如下:
①执行execute statement部分语句
②执行expression判断语句,若为TRUE,则返回①,否则跳出循环
do{
//execute statement;
...
}while(expression)
总结:三个循环方式都可以达到循环的效果,没有优劣之分,只是有时候因应用场景不一样,比如do/while中,execute statement部分一定会被执行一次,而for和while语句可以不被执行直接跳过循环,具体选用哪种方法,还要看具体应用场景,多写代码吧。
提示:判断语句部分的表达式,结果不一定要bool值,c++中将非0值都当TRUE处理,为0时才为FALSE。
4、程序跳转
break语句
break顾名思义就是“打破”的意思,该语句用于结束循环语句(for/do…while/while)和switch分支语句块,跳转到该语句块的后面进行执行,switch语句的break上面已经讲过了,下面将循环语句的内部结束方式,以while语句为例,for和do…while大同小异:
int i=10;
while(1){//这是一个死循环,必须从内部打破
i--;
if(i==0)//判断若i=0,则跳出循环
break;
cout<<i<<'\t';
}
这完全等价于:
int i=10;
while(i!=0){//这是一个死循环,必须从内部打破
i--;
cout<<i<<'\t';
}
输出为:
9 8 7 6 5 4 3 2 1
continue语句
continue语句用于跳过循环语句(for/do…while/while)的本次循环,进行下一次循环,依然以while为例:
int i=10;
while(1){//这是一个死循环,必须从内部打破
i--;
if(i==2)//如果i=2则跳过本次循环,进行下一次循环,continue后面的就不执行了
continue;
if(i==0)//判断若i=0,则跳出循环
break;
cout<<i<<'\t';
}
输出为:
9 8 7 6 5 4 3 1
goto语句
goto语句是无条件转移指令(显式修改程序计数器ip指针)的抽象,用于在语句间进行跳转,其语法中,在跳转的目标语句前设置一个标签(label),在需要跳转的地方用goto label语句来进行跳转。如下例,实现了一个循环:
int main(){
int a=10;
loop:
if(a>=0){
a--;
goto loop;
}
return 0;
goto语句的滥用会使程序可读性变差,使编译优化变得困难,而且90%以上的goto语句都可以使用其他语句来避免,故不是特别需要一般建议不要使用goto语句。
【二】单元级控制结构
1、显式调用
通过函数的显示调用,将程序执行顺序从主调函数转移到被调函数,在宏观上还是顺序执行。
2、异常处理—隐式调用
异常是程序运行过程中的异常错误,c++中以类进行封装,成为异常类。
C++的异常处理机制有3部分组成:try(检查),throw(抛出),catch(捕获)。try用于检查是否抛出异常,try语句块中至少包含一个throw,即抛出异常,发出错误信息,由catch来捕获异常信息,并加以处理。
一般throw抛出的异常要和catch所捕获的异常类型所匹配。catch只捕获与之类型匹配的异常,若该catch类型不匹配,就结束该函数,继续像外(主调函数)抛出该异常,直到有匹配的处理catch为止,若直到main函数都没找到匹配的catch,则程序调用库函数terminate,效果如下:
异常处理的一般格式为:
try{
被检查语句
throw 异常
}
catch(异常类型1){
进行异常处理的语句1
}
catch(异常类型2){
进行异常处理的语句2
}
...