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

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