最近使用了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\n", a);
a++;
}
while ( a < 20 ); LOOP:
printf("aa: %d\n", a);
printf("loop: %d\n", a);
a = 4;
printf("a = %d\n", 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

goto语句——慎用,但是可以用的更多相关文章

  1. 通过goto语句学习if...else、switch语句并简单优化

    goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构. 我理解的goto语句其实跟switch语句有相似之处,都是进行跳转.不同 ...

  2. goto语句 switch语句

    goto语句 #include <iostream> using namespace std; int main() { int i = 1; number: i++; std::cout ...

  3. 在程序中,你敢怎样使用“goto”语句!

    用goto是一个个人爱好的问题.“我”的意见是,十个goto中有九个可以用相应的结构化结构来替换.在那些简单情形下,你可以完全替换掉goto,在复杂的情况下,十个中也有九个可以不用:你可以把部分代码写 ...

  4. 布尔逻辑运算,goto语句

    布尔逻辑 bool类型可以有两个值:true或者false. 布尔比较需要使用布尔比较运算符(关系运算符),下图:var1为布尔类型的变量,var2,var3则可以是不同类型.

  5. Go 语言 goto 语句

    Go 语言的 goto 语句可以无条件地转移到过程中指定的行. goto语句通常与条件语句配合使用.可用来实现条件转移, 构成循环,跳出循环体等功能. 但是,在结构化程序设计中一般不主张使用goto语 ...

  6. C语言 goto语句

    /* goto语句 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* goto语句也 ...

  7. goto语句引起的crosses initialization of XXX

    1. 背景 goto语句虽然目前已经不提倡使用,但是用起来还是很方便,尤其是老代码中见的比较多. 在改动有goto语句的老代码时需要特别注意,是否跳过来资源的释放.有用变量的初始化等等. 很久之前写c ...

  8. C语言goto语句的使用

    不使用goto语句: 使用goto语句: 使用goto语句时需要注意以下原则:1) 不要过份地使用.比如图2中的60行就没有采用goto语句跳到程序的最后面,之所以这里不使用goto是为了阅读方便.因 ...

  9. goto语句的升级版,setjmp,longjmp

    我们知道goto语句是不能跳过函数的,但是在我么C语言的应用中,在不使用汇编的情况下,遇到需要跳出深层循环比如检错机制的时候,有确实想要跨函数跳转,有没有上面办法可以做到呢? 这就是今天要讲的两个库函 ...

随机推荐

  1. TCP/IP学习笔记17--TCP-- 窗口控制 重发控制 流控制

    事业无穷年 -- 韩愈 利用窗口控制提高速度: TCP传输数据是,以一个段为单位(每次发送一个数据包),每发一个段需要一次确认应答,这样就难免存在这样的缺点:包的往返时间越长,通信性能就越低. 为解决 ...

  2. elementui禁用全选按钮

     document.getElementsByClassName('el-checkbox__input')[0].classList.add('is-disabled')           doc ...

  3. 通过命令窗口导入导出oracle数据库到dmp文件

    通过命令窗口导入导出oracle数据库到dmp文件 很多时候我们需要备份Oracle的数据库,然后将数据导入其他数据库,因为有大文本字段会导致insert无法完全导出,只能导出为dmp文件,前提是wi ...

  4. Linux+QT界面开发(含数据库)小结

    今天十一国庆节,过了一个很有意义的国庆节,去了龙岗区图书馆,第一次知道了借的书可以在任意分馆归还!这个切实方便了广大读者.针对Linux应用,特意借阅一本:<linux环境下Qt4图形界面与My ...

  5. Spring MVC拦截器完整代码示例

     拦截器的作用: 编写一个自定义的类,实现相关拦截器接口:  preHandler不放行,直接return false:直接跳转到错误页面error.jsp postHandler后置处理器,也就是C ...

  6. C#解压、压缩高级用法

    压缩:(可以吧要排除的文件去掉) /// <summary> /// 压缩文件夹 /// </summary> /// <param name="folder& ...

  7. java之hibernate之组件映射

    1.在开发中,有的类信息比较复杂,而且某几个信息可以组成某一个部分,这个时候可以采用组件映射,组件映射是一张表映射到多个类.表结构 2.类的设计 Link.java public class Link ...

  8. Jmeter获取数据库数据

    1)添加需要的数据库驱动jar包,使用不同的数据库,需要引入的jar包是不一样的: mysql:无需引入其他数据库驱动jar包 sql server:下载sqljdbc.jar包 oracle:ora ...

  9. ColdFusion 编写WebService 示例

    1.开发 Web Services,编写cfcdemo.cfc组件,代码如下: <cfcomponent style ="document" namespace = &quo ...

  10. ConcurrentHashMap源码解析(JDK8)

    首先看看CHM的重要成员变量: public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ...