• c++ goto语句


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

    1. goto label;
    2. 其他语句
    3. label: statement; 

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

    例如:

    1. #include
    2. using namespace std;
    3. int main(int argc, const char * argv[]) {
    4. cout<<"1111111"<
    5. cout<<"2222222"<
    6. cout<<"3333333"<
    7. cout<<"4444444"<
    8. cout<<"5555555"<
    9. return 0;
    10. }

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

    1. 1111111
    2. 2222222
    3. 3333333
    4. 4444444
    5. 5555555

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

     cout<<"5555555"<

    1. #include
    2. using namespace std;
    3. int main(int argc, const char * argv[]) {
    4. cout<<"1111111"<
    5. cout<<"2222222"<
    6. goto EXIT;
    7. cout<<"3333333"<
    8. cout<<"4444444"<
    9. EXIT:
    10. cout<<"5555555"<
    11. return 0;
    12. }

    程序的输出结果如下:

    1. 1111111
    2. 2222222
    3. 5555555

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

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

    1. #include
    2. using namespace std;
    3. int main() {
    4. int ivar = 0;
    5. int num = 0;
    6. label:
    7. ivar++;
    8. num += ivar;
    9. if (ivar < 10) {
    10. goto label;
    11. }
    12. cout << num << endl;
    13. return 0;
    14. }
    15. //输出:55

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

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

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

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

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

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

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

    1. #include
    2. int main() {
    3. goto label;
    4. {
    5. int ivar = 0;
    6. }
    7. label:
    8. return 0;
    9. }

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

    1. for(...) {
    2. for(...) {
    3. while(...) {
    4. if(...) goto stop;
    5. .
    6. .
    7. .
    8. }
    9. }
    10. }
    11. stop:
    12. cout << "Error in program.";

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

  • 相关阅读:
    【node进阶】浅析Koa框架---ejs模板|文件上传|操作mongoDB
    在Spring Boot中使用JTA实现对多数据源的事务管理
    中国第一大微商TST涉嫌传销案听证会结束
    基于PHP+MYSQL高等数学在线学习教学系统的设计与实现
    【每日一题】递枕头
    深入Redis的切片
    List集合存储学生对象三种遍历方式
    LEVEL THE PLAYING FIELD
    随笔记录-springboot_ConfigFileApplicationListener
    16 - 多线程调优(下):如何优化多线程上下文切换?
  • 原文地址:https://blog.csdn.net/csj731742019/article/details/126078264