最近使用了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. Java开发笔记(一百二十三)AWT图像视图

    前面介绍了AWT的几种基础控件,从按钮到文本标签,从输入框到选择框,无一例外都能显示文字,唯独无法显示某张图片文件.本以为AWT会提供专门的控件来显示图片,然而偏偏没有意料之中的图像控件,这可真是弱爆 ...

  2. python标准库之glob介绍

    python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...

  3. SAS学习笔记58 单元格格式化设计

    单元格行_row_ 对于行单元格,主要就通过_row_这么一个自动变量的方式,来对单元格所有行进行格式化设计 例如,对性别为“男”的单元格所在行颜色设定为红色: 单元格列_col_ 将_row_改成_ ...

  4. 从create-react-app开始,构建项目架构

    1.生成项目 命令行执行:create-react-app  myapp,生成如下结构: 2.安装sass依赖,让你在项目中可以使用scss模块化,index.module.scss: npm i n ...

  5. Thread 与 ThreadLocal

    @Testpublic void testThread() { Thread thread = Thread.currentThread(); System.out.println("thr ...

  6. Dubbo学习摘录(二)

    扩展点机制 扩展点的配置 (1)根据关键字读取配置,获取具体的实现类 比如在 dubbo-demo-provider.xml 文件中配置: 则会根据rmi去读取具体的协议实现类RmiProtocol. ...

  7. 一步一步手写GIS开源项目-(2)地图平移缩放实现

    系列文章目录 一步一步手写GIS开源项目-(1)500行代码实现基础GIS展示功能 一步一步手写GIS开源项目-(2)地图平移缩放实现 项目github地址:https://github.com/Hu ...

  8. java之结合代码理解synchronized关键字

    为了保证数据的一致性即实现线程的安全性,java虚拟机提供了同步和锁机制.synchronized关键字是最基本的互斥同步手段.除此之外,还可以使用java.util.concurrent包中的重入锁 ...

  9. power shell命令添加SharePoint用户组与用户(用户为域用户)

    查看SharePoint用户组 Get-PnPGroup 查看某一用户组 Get-PnPGroup -Identity "用户组名" 查看某一用户组下的所有成员 Get-PnPGr ...

  10. Ant Design Pro实现导出Excel

    react Ant Design ProUI框架导出Excel(只能导出当前列表数据) 插件安装 npm install js-export-excel 安装完成之后开始引入 import Expor ...