c++ goto语句

goto语句又称无条件跳转语句,用于改变语句执行顺序。goto语句的一般格式为:

goto label;

其他语句

label: statement; 

label是用户可定义的一个标识符,以冒号结束。

例如:

#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
  
    cout<<"1111111"<<endl;
    cout<<"2222222"<<endl;
    cout<<"3333333"<<endl;
    cout<<"4444444"<<endl;
    cout<<"5555555"<<endl;
    return 0;
}

在不添加goto语句的情况下,上面的代码会按照正常的顺序输出:

1111111
2222222
3333333
4444444
5555555

如果添加goto语句后,改变程序的执行顺序,例如运行完cout<<"2222222"<<endl;后直接跳到

 cout<<"5555555"<<endl; 从而直接忽略 中间输出3333333和4444444的代码,那么程序做如下修改:

#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
  
    cout<<"1111111"<<endl;
    cout<<"2222222"<<endl;
    goto EXIT;
    cout<<"3333333"<<endl;
    cout<<"4444444"<<endl;
    EXIT:
    cout<<"5555555"<<endl;
    return 0;
}

程序的输出结果如下:

1111111
2222222
5555555

由此可见,程序按照之前的设定,跳过中间输出333333和444444的代码了。

再举个例子,比如实现1到10的累加 goto版的

#include <iostream>
using namespace std;

int main() {
    int ivar = 0;
    int num = 0;
label:
    ivar++;
    num += ivar;
    if (ivar < 10) {
        goto label;
    }
    cout << num << endl;

    return 0;
}
//输出:55

程序中利用标签实现循环功能。当语句执行到 if(ivar<10)时,如果条件为真,则跳转到标签定义为 label处。这是一种不提倡的做法,它会使得程序的执行循序变得混乱,cpu需要不停地进行跳转,效率比较低,而且goto语句任何程序可以修改,程序中如果出现多处相同的标签会使得程序逻辑变得复杂,因此,在开发中时慎用goto语句。

最后说下goto语句使用时的注意说明

1、使用goto语句时,应该注意标签的定义。在定义标签时,其后不能紧跟着“}”符号。需要在标签后面添加一段可执行的语句

 在上述代码中定义标签label时,其后没有执行代码了,所以会出现编译错误。如果程序中出现上述情况,可以在标签后面添加一个可执行的语句就行了,以解决编译错误,比如添加一行打印输出语句。

 2、在使用goto语句还应该注意不能越过复合语句之外的变量定义的语句。例如,下面的goto语句是非法的。

 在上述代码中goto语句试着越过变量ivar的定义,导致编译错误。编译器也会提示

 那么解决上面问题的方法就是将变量的声明复合语句块中。做如下修改

#include <iostream>

int main() {
    goto label;
   {
        int ivar = 0;
   }
label:
    return 0;
}

一个很好用使用goto语句的例子是从一个深度嵌套程序退出。

for(...) {
   for(...) {
      while(...) {
         if(...) goto stop;
         .
         .
         .
      }
   }
}
stop:
cout << "Error in program.";

省去了转到将迫使要执行多个附加测试。一个简单的break语句也不会工作,因为这只会导致程序从最里面的循环退出。

  • 18
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chen_ShengJie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值