专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!
目录
- 5.5 跳转语旬
- break语句
- continue 语句
- goto语句
5.5 跳转语旬
跳转语句中断当前的执行过程。C++语言提供了4种跳转语句:break、continue、goto和return。本章介绍前三种跳转语句。
break语句
break语句(break statement)负责终止离它最近的while、dowhile、for或switch语句,并从这些语句之后的第一条语句开始继续执行。
break语句只能出现在选代语句或者switch语句内部(包括偏套在此类循环里的语句或块的内部)。break语句的作用范围仅限于最近的循环或者switch:
string buf;
while(cins>>buf && !buf.empty(){
switch(buf[0])
{
case '-':
//处理到第一个空白为止
for(auto it=buf.begin()+1;it!=buf.end();++it){
if(*it==' ')
break;//#1,离开for循环
// ...
}
//break#1将控制权转移到这里
//剩余的"-"处理:
break;// #2,离开switch语句
case '+':
// ...
}//结束switch
//结束switch:break #2将控制权转移到这里
}//结束while
标记为#1的break语句负责终止连字符case标签后面的for循环。它不但不会终止switch语句,甚至连当前的case分支也终止不了。接下来,程序继续执行for循环之后的第一条语句,这条语句可能接着处理连字符的情况,也可能是另一条用于终止当前分支的break语句。
标记为#2的break语句负责终止switch语句,但是不能终止while循环。执行完这个break后,程序继续执行while的条件部分。
continue 语句
continuei吾句(continue statement)终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for、while和do while循环的内部,或者嵌套在此类循环里的语句或块的内部。和break语句类似的是,出现在嵌套循环中的continue语句也仅作用于离它最近的循环。和break语句不同的是,只有当switch语句嵌套在迭代语句内部时,才能在switch中使用continue。
continue语句中断当前的迭代,但是仍然继续执行循环.对于while或者do while语句来说,继续判断条件的值;对于传统的for循环来说,继续执行for语句头的expression;而对于范围for语句来说,则是用序列中的下一个元素初始化循环控制变量。
例如,下面的程序每次从标准输入中读取一个单词。循环只对那些以下画线开头的单词感兴趣,其他情况下,我们直接终止当前的迭代并获取下一个单词:
string buf;
while(cin>>buf&&Lbuf.empty(1){
if(buf[0]!='_'){
continue ;// 接着读取下一个输入
}
//程序执行过程到了这里?说明当前的输入是以下画线开始的;接着处理buf.....。
}
goto语句
goto语句(goto statement)的作用是从goto语句无条件跳转到同一函数内的另一条语句。
不要在程序中使用goto语句,因为它使得程序既难理解又难修改。
goto语句的语法形式是
goto label;
其中,label是用于标识一条语句的标示符。带标签语句(labeled statement)是一种特殊的语句,在它之前有一个标示符以及一个冒号:
end:return;//带标签语句,可以作为goto的目标
标签标示符独立于变量或其他标示符的名字,因此,标签标示符可以和程序中其他实体的标示符使用同一个名字而不会相互干扰。goto语句和控制权转向的那条带标签的语句必须位于同一个函数之内。
和switch语句类似,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内:
goto end;
int ix=10;//错误:goto语句绕过了一个带初始化的变量定义
end:
//错误:此处的代码需要使用tx,但是goto语句绕过了它的声明
tx=42;
向后跳过一个已经执行的定义是合法的。跳回到变量定义之前意味着系统将销毁该变量,然后重新创建它:
//向后跳过一个带初始化的变量定义是合法的
begin:
int sz = get_size();
if(sz <= 0)
goto begin;
在上面的代码中,goto语句执行后将销毁sz。因为跳回到begin的动作跨过了sz的定义语句,所以sz将重新定义并初始化。