goto关键字你不知道的"那些事"(C语言提升)
1、日常聊一聊(看文章与听音乐更配)
今天在前面放了一段伍佰的歌曲《last Dance》,这首老歌最近突然火了是因为一部爱情穿越电视剧《想见你》,剧情还不错大家感兴趣可以看一看,大伙不要天天搞研究,敲代码,多一点不一样的生活会有不一样的精彩,效率也会大大提高。
好了,之前一直都没有透露自己的联系方式,最近一些小伙伴私信给我说,有问题在公众号私信我比较麻烦而且有时候也没注意订阅号,希望我能够提供个人微信。确实最近发现私信的给我的图片有时候打不开,为了更好的交流这里公布一下个人的微信号,大家可以添加一下,研究、学习、生活上都可以跟我交流,我也可以准备酒,等待着你的故事:
好了,要进入今天的主题了,今天我们要讨论的是C语言中相对比较冷门的知识关键字goto!
2、goto关键字基础知识
int main(int argc, char *argv[]) {
//无条件跳转到标签处
goto thelastBug;
printf("未知bug\n");
//标签定义
thelastBug:
printf("最后一个bug\n");
return 0;
}
注意点:
1)goto label;后面的分号一定得打。(个人经常忘记,这里提醒一下各位)
2)goto只能在函数内部无条件跳转,不能从一个函数跳转到另外一个函数。
3)label:的标识在使用goto语句的前后均可,不遵循先定义后使用。
4)label的作用域在函数内部,不同函数之间可以定义相同的label。
(上面的几点注意项大家有时间可以在电脑上实验下)
3、备受争议的C语言关键字-goto
/**********************************
* Fucion: main
* Descri: if+goto 模拟for语句
**********************************/
int main(int argc, char *argv[]) {
//循环变量定义
int i = 0;
i = 0;
Loop:if(i > 5){goto LoopEnd;}i++;
//for(i= 0;i<5;i++)
//{
printf("%d\n",i);
goto Loop;
//}
LoopEnd:
printf("最后一个bug\n");
return 0;
}
4、大佬都是这么用goto的!
1)瞄一瞄linux中的goto
我们读过linux相关代码的小伙伴会发现goto语句的使用无处不在,首先我截取了uboot1.1.6中的一部分代码来欣赏一下(毕竟uboot也是大佬写的):
2)使用goto跳出多层循环
我们都知道break仅仅只能跳出当前循环,如果遇到多层循环需要跳出的问题,就需要每个循环都需要break一下,并且还需要内层循环传递相关信号让外层循环break掉,从而退出多层循环,这样做实在有点麻烦,而且代码结构也不好看,那么有些小伙伴就会问那我直接return掉就好了,我们来看一下下面的代码你就会有自己的决定了:
/**********************************
* Fucion: main
* Descri: goto跳出多层循环
**********************************/
int main(int argc, char *argv[]) {
int i = 0,j = 0,k = 0;
for(i = 0 ;i < 10;i++)
{
for(j = 0 ;j < 10;j++)
{
for(k = 0 ;k < 10;k++)
{
//if(条件不满足)
//goto ERROR;
}
//if(条件不满足)
//goto ERROR;
}
//if(条件不满足)
//goto ERROR;
}
return 1;
ERROR:
//相关资源释放
printf("最后一个bug\n");
return 0;
}
/**********************************
* Fucion: main
* Descri: return跳出多层循环
**********************************/
int main(int argc, char *argv[]) {
int i = 0,j = 0,k = 0;
for(i = 0 ;i < 10;i++)
{
for(j = 0 ;j < 10;j++)
{
for(k = 0 ;k < 10;k++)
{
//if(条件不满足)
//相关资源释放
//return 0;
}
//if(条件不满足)
//相关资源释放
//return 0;
}
//if(条件不满足)
//相关资源释放
//return 0;
}
printf("最后一个bug\n");
return 1;
}
3)作者对goto关键字小节
这里仅仅代码个人的使用观点:
1)上面两个例子中我们使用goto是可以借鉴的,对程序的效率和美观有一定的效果;
2)对于一般的程序goto语句的功能尽量简单,便于分析和代码的整洁,如果不能带来较大的优势还是尽量少用;
3)个人平时研究控制理论,对于任何事物觉得要么是发散、要么是收敛比较好分析处理问题,对于震荡问题相对比较麻烦,所以对于如下图2种goto的使用情景我是推荐的,前面说了只要我们控制好goto的灵活度就能够为我们服务,那么我们只需要规定在一个函数中其只是单向跳转,我们对程序的把控能力就大大提高了。
5、总结
好了,今天的内容就到这里吧,看完这个文章希望大家能够有点收获吧,也希望大家能帮忙传播传播,"再看"多点几个,大家的认可都是我坚持写作的动力源泉,写作这条路上还是需要大家多多陪伴。
感谢关注公众号:"最后一个bug",我们下期见!