这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 嵌入式C程序中,goto用得比较少?

共3条 1/1 1 跳转至

嵌入式C程序中,goto用得比较少?

高工
2023-10-08 09:54:00     打赏
1 什么是goto语句?

    goto语句被称为C语言中的跳转语句。用于无条件跳转到其他标签。它将控制权转移到程序的其他部分。    goto语句一般很少使用,因为它使程序的可读性和复杂性变得更差。语法:

image.png


goto语句示例

    让我们来看一个简单的例子,演示如何使用C语言中的goto语句。    打开Visual Studio创建一个名称为:goto的工程,并在这个工程中创建一个源文件:goto-statment.c,其代码如下所示。image.png    执行上面代码,得到以下结果image.png2 为什么它这么不受待见?    二十几年前,当计算机编程尚处于起步阶段时,程序流程是由“GOTO”语句来控制。该类语句允许程序员对当前代码行断行,而直接进入另一个不同的代image.png段。以下为简单的示例,使用GOTO语句:

    编程语言终究开始引入了函数的概念,即允许程序对代码进行断行。如果已经完成,不再使用goto语句来表示代码的断行。函数调用后,函数将回到下一条指令。列表2为示例。这一做法改善了程序结构,提高了可读性。    自此,这被视为编写程序的正确方法。只要看到或想到goto语句,就会让软件工程师退缩,产生本能 的厌恶。其中一个主要的原因是,一个遍布goto语句的程序会让让人很难抓住重心,不便于对程序的理解和维护。用函数控制流程,如下所示。
image.png    而wikipedia上的解释就是,GOTO语句一直是批评和争论的目标,主要的负面影响是使用GOTO语句使程序的可读性变差,甚至成为不可维护的「面条代码」。随着结构化编程在二十世纪六十年代到七十年代变得越来越流行,许多计算机科学家得出结论,即程序应当总是使用被称为「结构化」控制流程的命令,如迴圈以及if-then-else语句来替代GOTO。甚至在今天,许多程序风格编码标准禁止使用GOTO语句。    为GOTO语句辩护的人认为,加以限制地使用GOTO语句不会导致低质量的代码,并且声称在许多编程语言中,一些任务如果不使用一条或多条GOTO语句是无法被直接实现的。如有限状态自动机的实现、跳出嵌套循环以及异常处理。    大概最著名的对于GOTO的批评是艾兹格·迪杰斯特拉(Edsger Wybe Dijkstra)在1968年的一篇名稱為《GOTO陳述有害論》的論文。[2]迪杰斯特拉认为不加限制地使用GOTO语句应当从高级语言中废止,因为它使分析和验证程序正确性(特别是涉及循环)的任务变得复杂。另外一种观点出现在高德纳的Structured Programming with go to Statements [3]中,文章分析了许多常见编程任务,然后发现其中的一些使用GOTO将得到最理想的结构。    这些批评在一些编程语言的设计上起到了效果。虽然Ada语言的设计者在二十世纪七十年代晚期意识到了对于GOTO的批评,这条语句仍旧被包含进去,主要是用来支持自动生成那些goto语句必不可少的代码。[4]但是,作为goto语句目的地的标签必须使用双尖括号括起来(如:<<Start_Again>>),而这个语法在其他语言中都不被使用。这使得检查程序中goto目的地的存在变得容易。goto语句本身使用简单的形式goto Start_Again;.3 goto的变形    许多语言,如C语言和Java,提供了相关的控制流语句,如break和continue,它们都是有效地被限制的goto语句。它们的作用是无条件跳转,但是只能够跳到循环块结束的位置——继续进入下一循环(continue)或者结束循环(break)。    C语言、C++和Java中的switch语句高效地实现了一个多路goto,跳转目标由表达式的值来选择。    这也导致了我们没有不得不使用goto的理由。    针对这些,导致目前goto的使用情况是这样的:    goto语句的结果:在C/C++等高级编程语言中保留了goto语句,但被建议不用或少用。在一些更新的高级编程语言,如Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使 用,使程序简洁易读;尽管如此后来的c#还是支持goto语句的,goto语句一个好处就是可以保证程序存在唯一的出口,避免了过于庞大的if嵌套。    另一方面,goto语句只是不提倡,当然不是禁用,那么在什么情况下可以使用goto语句呢?4 可以考虑使用goto的情形

  • 从多重循环中直接跳出 ;
  • 出错时清除资源;
  • 可增加程序的清晰度的情况。

    不加限制地使用goto:破坏了清晰的程序结构,使程序的可读性变差,甚至成为不可维护的"面条代码"。经常带来错误或隐患,比如它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。    下列关于使用goto语句的原则可以供读者参考。

  • 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。  
  • 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。  
  • 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。  
  • 应该避免像两个方向跳转。这样最容易导致"面条代码"。

    阅读过linux内核代码的同学应该注意到,linux内核代码里面其实有不少地方用了goto语句,但是你会发现,它的使用非常谨慎,基本都遵循上面提到的几个原则。





关键词: 嵌入式     goto    

院士
2023-10-08 10:16:22     打赏
2楼

在同一个函数里面使用goto还是非常方便的。



专家
2023-10-17 19:46:38     打赏
3楼

早期编程C语言的时候,用的GOTO确实比较多。包括在VB6(含之前版本的)。后来,为了提高代码阅读性及可维护性,就避免使用GOTO了。再后来随着异常处理的方式,GOTO好像就不再被使用了。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]