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本身有限制,只能是當前函數。所以,從這個角度來說,標籤的作用域也可以說是當前函數。
參考: