当前位置:首页 > 公众号精选 > strongerHuang
[导读]关于C语言的goto语句存在很多争议,很多书籍都建议“谨慎使用,或者根本不用”。Linux之父Linus在Linux中大量使用goto,也是在启示着我们可以合理使用goto语句。存在即合理,既然是C语言中的一个知识点,我们还是有必要学会使用。


转自:嵌入式大杂烩


关于C语言的goto语句存在很多争议,很多书籍都建议“谨慎使用,或者根本不用”。Linux之父Linus在Linux中大量使用goto,也是在启示着我们可以合理使用goto语句。


存在即合理,既然是C语言中的一个知识点,我们还是有必要学会使用。先看一些goto如何用:

一、goto的基本语法

goto语句有两部分:goto和标签名。标签的命名规则与变量的命名规则一样。如:

goto label;

要让这条语句正常工作,函数还必须包含另一条标为label的语句,该语句以标签名后紧跟一个冒号开始,如:

label:printf("goto here.\n");

二、goto的例子

/*
编译环境:mingw32 gcc6.3.0
*/ #include  #include  /* goto测试 */ void TestGoto(void) {  int i;  while (1)
    { for (i = 0; i < 10; i++)
	{ if (i > 6)
	    { goto label;
	    } printf("%s : i = %d\n", __FUNCTION__, i);
	}
    }
	label: printf("test goto end!");
} int main(void) {
    TestGoto();
}


运行结果:


从运行结果我们明显可以知道goto用法,可以跳出多重循环,程序执行过程中遇到goto语句就可以跳转到label处继续执行。

值得注意的一点是:goto语句与其跳转的标签处必须在同一个函数内。

三、goto与break、continue的区别?

同样是跳转语句,goto语句与break、continue语句有什么区别呢?

实际上,break和continue是goto的特殊形式。使用break与continue的好处是:其名称已经表明他们的用法。

下面通过代码实例看一下break与continue的用法:

1、break测试函数

使用上面的测试程序,建一个测试break语句的函数void TestBreak(void);,如:

/* break测试 */ void TestBreak(void) {  int i;  while (1)
    { for (i = 0; i < 10; i++)
	{ if (i > 6)
	    { break; /* 第一个break:跳出for循环 */ } printf("%s : i = %d\n", __FUNCTION__, i);
	} printf("Now i = %d\n", i); break; /* 第一个break:跳出while循环 */ }  printf("test break end!");
}


运行结果:


从运行结果我们明显可以知道,break可以退出当前循环。

在本例子中,第一个break语句退出当前的for循环,第二个break语句退出当前的while循环。可见,一个break可退出一层循环。

所以,根据break与goto的特点知道,如果是跳出很多层循环,使用goto会方便些。

2、continue测试函数

同样的,建一个测试continue语句的函数void TestContinue(void);,如:

/* continue测试 */ void TestContinue(void) {  int i;  for (i = 0; i < 10; i++)
    { if (i > 6)
	{ printf("i = %d, continue next loop\n", i); continue; /* continue:结束本次循环(而不是终止这一层循环)继续进入下一次循环 */ } printf("%s : i = %d\n", __FUNCTION__, i);
    }  printf("test break end!");
}


运行结果:


从运行结果我们明显可以知道,continue可以结束本次循环(而不是整个循环)而进入下一次循环(i所代表的就是循环的次数)。

四、支持与反对goto的理由是什么?

1、不提倡使用goto

不提倡使用goto的占比应该比较多,不提倡的原因主要是:很容易把逻辑弄乱且难以理解。

2、使用goto的理由

这一部分人认为goto可以用在以下两种情况比较方便:

(1)跳出多层循环。

这个例子就类似于我们上面的goto测试程序。

(2)异常处理。

一个函数的执行过程可能会产生很多种情况异常情况。下面有几种处理方式,以代码为例:

方法一:做出判断后,如果条件出错,直接return。

int mystrlen(char *str) { int count = 0; if (str == NULL)
   { return -1;
   } if (*str == 0)
   { return 0;
   } while(*str != 0 )
   {
      count++;
      str++;
   } return count;
}


方法二:先设置一个变量,对变量赋值,只有一个return。

int mystrlen(char *str) { int ret; if (str == NULL)
   {
      ret = -1;
   } else if (*str == 0)
   {
      ret = 0;
   } else {
      ret = 0; while(*str != 0 )
      {
         ret++;
         str++;
      }
   } return ret;
}


方法三:使用goto语句。

int mystrlen(char *str) { int ret; if (str == NULL)
   {
      ret = -1; goto _RET;
   } if (*str == 0)
   {
      ret = 0; goto _RET;
   } while(*str !=0 )
   {
      ret++;
      str++;
   }

_RET: return ret;
}


其中,方法三就是很多人都提倡的方式。统一用goto err跳转是最方便且效率最高的,从反汇编语句条数可以看出指令用的最少,消耗的寄存器也最少,效率无疑是最高的。

并且,使用goto可以使程序变得更加可扩展。当程序需要在错误处理时释放资源时,统一到goto处理最方便。这也是为什么很多大型项目,开源项目,包括Linux,都会大量的出现goto来处理错误!

以上就是关于goto语句的基本使用、goto与break、continue的区别的总结,如有错误,欢迎指出!如果觉得不错可以帮忙分享~

参考资料:

1、《C Primer Plus》 2、https://www.cnblogs.com/trying/archive/2012/06/25/2863753.html


推荐阅读:

FILE、LINE等几种C标准用法

su、sudo、sudo su、sudo -i使用和区别

百度网盘国际版 Dubox 干净好用,却与国内用户无缘


关注 微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。


长按前往图中包含的公众号关注

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

为增进大家对嵌入式主板的认识,本文将对嵌入式主板以及嵌入式主板常见问题及其解决方法予以介绍。

关键字: 嵌入式 指数 主板

为增进大家对嵌入式系统的认识,本文将对嵌入式系统、嵌入式系统的特点予以介绍。

关键字: 嵌入式 指数 嵌入式系统

为增进大家对嵌入式的认识,本文将对嵌入式、嵌入式工作相关的内容予以介绍。

关键字: 嵌入式 指数 嵌入式技术

机器人操作系统(ROS)驱动程序基于ADI产品而开发,因此可直接在ROS生态系统中使用这些产品。本文将概述如何在应用、产品和系统(例如,自主导航、安全气泡地图和数据收集机器人)中使用和集成这些驱动程序;以及这样将如何有助...

关键字: 电机控制器 机器人 嵌入式

支持高达48V@5A的PD受电模式,达到目前USB PD最高标准。

关键字: 嵌入式 开发板

【2024年4月8日,德国慕尼黑讯】低碳化和数字化是当今时代人们面临的两大核心挑战,人类社会需要依靠创新和先进的技术,才能破除挑战、推动转型进程。在德国纽伦堡举办的2024国际嵌入式展(Embedded World 20...

关键字: 半导体 微控制器 嵌入式

TDK 株式会社(TSE:6762)进一步扩充 Micronas 嵌入式电机控制器系列 HVC 5x,完全集成电机控制器与 HVC-5222D 和 HVC-5422D,以驱动小型有刷(BDC)、无刷(BLDC)或步进电机...

关键字: 嵌入式 电机控制器 内存

嵌入式开发作为信息技术领域的重要分支,其涉及的语言种类繁多,各具特色。这些语言的选择取决于目标平台的特性、性能需求、开发者的熟练程度以及项目的具体要求。本文将详细介绍几种常见的嵌入式开发语言,包括C语言、C++、汇编语言...

关键字: 嵌入式开发 C语言

嵌入式开发作为信息技术领域的重要分支,在当今智能化社会中的地位日益显著。它不仅在日常生活中的消费电子产品、工业自动化、汽车电子、航空航天等诸多领域发挥着不可或缺的作用,而且随着物联网、大数据、人工智能技术的发展,嵌入式开...

关键字: 嵌入式 信息技术

中国,北京和德国,纽伦堡 - EQS Newswire - 2024年4月2日 - 绿芯将于4月9日至11日在德国纽伦堡举行的2024年嵌入式世界展会 ((embedded world 2024),4A号馆606展位)展...

关键字: 固态硬盘 嵌入式 智能交通
关闭
关闭