C语言禁术——goto语句
goto语句是一种无条件转移语句,goto 语句的使用格式为:
goto 语句标号;
其中标号是一个有效的标识符,这个标识符加上一个“:”(冒号)一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句。
另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行。
goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用goto语句则比较合理。
大多数人在学习C语言的时候都或多或少的看过或者听过不要使用goto语句,但是,在某些时刻,该goto时就goto。
eg:
#include <stdio.h> #include <stdint.h> #include <string.h> int main(void) { for(int i=0;i<100;i++) for(int j=0;j<100;j++) { if(i+j==100) { goto test; } } test: printf("test...\n"); return 0; }
这个例子可能是大家见的最多的跳出循环用法,因为这里break不好使。但是。。。
eg:
#include <stdio.h> int main(void) { int a=2; if(a>2) { for(int i=0;i<10;i++) { printf("i=%d ",i); if(i==5) goto test; } } test: printf("\r\nyes"); return 0; }
第一次尝试使用goto的时候,有一个误区,就是如果没有执行goto,goto的标签会不会执行?
我之前以为不会执行,但是,goto的标签,就是程序的一部分,哪怕没有执行goto,goto的标签也会顺着程序执行流程而执行(如上图测试一样)。这就给我们写程序的时候带了隐藏的bug,千万别以为goto不执行,标签就不执行了。
Summary:
在我们使用goto跳出循环或者处理关键代码段的时候,goto标签的位置,一定是异常处理的位置,哪怕不执行goto,标签也会执行。但很多时候,goto出去的代码段都是关键代码处理,在没有执行goto的时候,我们不想标签处的代码被执行(比如异常处理),这样我们就可以通过下面的方式做到:
eg:
#include <stdio.h> int main(void) { int flag=0; int a=2; if(a>2) { for(int i=0;i<10;i++) { printf("i=%d ",i); if(i==5) { flag=1; goto test; } } } if(flag==1) { test: printf("\r\nyes"); } return 0; }
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1907263/o_201227061707QQ20201227141844.png)
![](https://images.cnblogs.com/cnblogs_com/yangguang-it/1704156/o_200415115115qrcode_for_gh_5c7d1da35871_258.jpg)
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |