一、开篇
C语言中的goto语句允许把控制无条件转移到同一函数内的被标记的语句。
在linux kernel中随处可见goto的影子,为了加深对goto的理解,从而更好的分析使用goto的代码,便决定写下该篇文章。
二、goto示例
1、设计一个print_info函数:
/* print _info */
int print_info(char param)
{
if(param == '1')
{
printf("1:<><>\r\n");
goto out0;
}
else if(param == '2')
{
printf("2:<><><><>\r\n");
goto out1;
}
return 5;
out0:
printf(">>>>this is [out0]\r\n");
out1:
printf(">>>>this is [out1]\r\n");
return 1;
}
2、设计一个main函数
/* main */
int main(int argc,char *argv[])
{
if(argc == 2)
{
char *temp = argv[1];
int ret = print_info(*temp);
printf("printf_info return : [%d]\r\n",ret);
}
else
{
printf("usage error!! or param error!!\r\n");
}
return 0;
}
3、根据程序功能编译后运行结果如下:
当输入参数为:999,程序运行结果:printf_info return :[5]
当输入参数为:1,程序运行结果:
1:<><>
>>>>this is [out0]
>>>>this is [out1]
printf_info return : [1]
当输入参数为:2,程序运行结果:
2:<><><><>
>>>>this is [out1]
printf_info return : [1]
三、总结
对于goto关键字来说,很多时候会出现逻辑较为复杂的情况,
如上代码所示,如果输入参数为999,那么out0:和out1:后代码将不会被执行,会返回5;如果把代码中的return 5这行去掉,那么out0和out1后面的代码都会被执行。
如果输入1或者2这时候会调转到对应的out0或out1去执行代码。
总结一下,使用到goto的代码比没有使用goto的代码逻辑分析起来复杂,故在自己实际的开发设计中,还是尽量使用break、continue关键词代替goto实现复杂的逻辑…