zoukankan      html  css  js  c++  java
  • goto语句——慎用,但是可以用

    最近使用了goto语句,是因为if嵌套太深了,因此把错误处理同意了,直接使用goto语句。

    举例:

    #include <stdio.h>
    
    int main ()
    {
    
        /* local variable definition */
    
        int a = 10;
    
        /* do loop execution */
        if (1)
        {
            do
            {
                if ( a == 15)
                {
                    /* skip the iteration */
                    a = a + 1;
                    goto LOOP;
                }
                printf("value of a: %d
    ", a);
                a++;
            }
            while ( a < 20 );
    
    LOOP:
            printf("aa: %d
    ", a);
            printf("loop: %d
    ", a);
            a  = 4;
            printf("a = %d
    ", a);
        }
    
        return 0;
    
    }
    

      

    多层嵌套里踹出去,或者有选择的退到第几层,这时候用goto是没毛病的,label写的明白点就行。注意不要钻来钻去,仅用于可控层数的break和continue,跳你就跳到某层循环结尾(大continue),或者紧贴在某层循环结束之后(大break)。另外记得用RAII保护资源不要泄露。对这种场景goto是最优解,该goto你就goto,用各种其他语法来“重新实现goto”是毫无意义的,只会比goto繁琐、更不可读,而且没有收益。比如说原本一个完整的算法核心逻辑,可能就那么几十行,需要goto跳几个循环的,你给搞成状态机、搞好几个只会用一次的函数,再来几个变量传递状态,你说你干嘛呢,好好一段代码被你搞成个迷宫,就为了不写“goto”?

    造成这个现象的原因是C/C艹没有控制层数的break和continue,用goto是在实现这个缺失的功能。

    其他场景下一般没必要用goto。

    结论分析及优缺点

    goto 语句可用于跳出深嵌套循环
    goto语句可以往后跳,也可以往前跳,且一直往前执行

    goto只能在函数体内跳转,不能跳到函数体外的函数。即goto有局部作用域,需要在同一个栈内。 

    goto 语句标号由一个有效地标识符和符号";"组成,其中,标识符的命名规则与变量名称相同,即由字母、数字和下划线组成,且第一个字符必须是字母或下划线。执行goto语句后,程序就会跳转到语句标号处,并执行其后的语句。
    通常goto语句与if条件语句连用,但是,goto语句在给程序带来灵活性的同时,也会使得使程序结构层次不清,而且不易读,所以要合理运用该语句。

    参考:https://www.askpure.com/course_TGESH6E1-XRQR2I14-9XPX7Q53-KDBES2UV.html

    https://zhuanlan.zhihu.com/p/33780928

    https://www.cnblogs.com/oxspirt/p/7485873.html

    https://www.zhihu.com/question/27922046

  • 相关阅读:
    php解决与处理网站高并发 大流量访问的方法
    mysql事务和锁InnoDB
    从一个死锁看mysql innodb的锁机制
    Git如何删除自己创建的项目
    公众号的坑
    字符串转Unicode码
    字符串转UTF-8码(%开头)
    git介绍和使用
    ng2中文文档地址
    两个数组的排序方法
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/11670913.html
Copyright © 2011-2022 走看看