C-goto语句的使用

goto主要用于函数执行到一定步骤后,跳转到返回成功或失败的代码。那么为什么不能直接返回而需要使用goto呢?就我个人理解,使用goto的好处之一是使代码更加简洁清晰。

例如,当函数中有多个地方需要返回成功或失败,而且返回之前可能需要有固定的代码(如释放内存),如果不使用goto语句,意味着需要在每个返回的地方都写上同样的代码,造成代码冗余。举个例子:

if(contition1)
{
    free(p);
    return -1;
}
while(condition2)
{
    //do something
    if(condition3)
    {
        free(p);
        return -1;
    }
    //do something
}
free(p);
return 0;

以上可以改为:

if(contition1)
    goto error;
while(condition2)
{
    //do something
    if(condition3)
        goto error;
    //do something
}
free(p);
return 0;
error:
free(p);
return -1;

这样,结构看起来更加清晰,也方便维护,比方说之后函数中还需要释放指针p2指向的空间,原来的写法就要在每个return的地方都加上free(p2),十分麻烦,而goto的写法只要在error标签之后增加一句free(p2)即可。

注意,goto语句和标签之间不能有变量声明,否则会报错C2362,说跳过了变量的初始化操作,网上查阅原因如下:

goto 不能向前跳过变量定义语句,给出的理由是可能引起未定义的变量使用。当确实要这样使用时,需要把定义语句使用{}括起来。

最后,标签本身没有作用域的,只是一个标志点。但是goto本身有限制,只能是当前函数。所以,从这个角度来说,标签的作用域也可以说是当前函数。

参考:

1.http://www.myexception.cn/cpp/1737658.html

2.http://www.imooc.com/wenda/detail/525266

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章