++++++++++++++++++++++++++++++++++++++++++
《C語言深入理解系列 - 浪裡白條:goto》
查看其它博文請關注原創作者。
本文系本站原創,歡迎轉載! 轉載請註明出處:
http://blog.csdn.net/mr_raptor/article/details/7211005
++++++++++++++++++++++++++++++++++++++++++
浪裡白條:goto
描述:在所有的程式設計語言裡,恐怕沒有哪個關鍵字可以和goto相比,它可以指哪打哪,完全不用去顧忌編碼規則,在代碼世界裡遊刃有餘,混得代碼海洋裡的浪裡白條美譽,也正是由於其放蕩不羈的特性,被編碼規則牢牢劃死在編程準則不允許之首。
作用:正如其名,go to everywhere,它可以在代碼邏輯中任意穿梭,只要給我定義一個靶心(標籤),我就可以打破邏輯直接到達,如下面樣本。
if(網卡未初始化){<br />// 初始化網卡<br />if(初始化出錯)<br />goto error;<br />}</p><p>char * buf = (char*)malloc(20);<br />if(接受網卡資料){<br />if(資料較驗錯誤)<br />goto checkNumError;<br /> //寫入到buf中<br />}else{<br />goto timeupError;<br />}</p><p>checkNumError:<br />// 處理較驗出錯<br />goto freeMem;<br />timeupError:<br />// 處理逾時出錯<br />freeMem:<br />free(buf);<br />error:<br /> // 其它善後處理<br />
通過上面的代碼可以看出,使用goto關鍵字,程式邏輯非常的自由,網卡初始化出錯時,直接跳到23行執行,第9行,資料較驗出錯,直接跳到16行,然後處理完後跳到21行,執行buf的記憶體釋放。雖然可以看到代碼邏輯很自由,但是還是會發現有點混亂,如果程式員沒有足夠的代碼經驗,很容易出現邏輯問題,因此很多派系的編碼規範中規定,禁止或盡量不使用goto關鍵字,很容易讓程式員範迷糊。但是在很多場合下,使用goto關鍵字可以更方便快捷,比如:錯誤處理時,其實上面的例子就是一個簡單的驅動錯誤處理例子。
使用goto時,請注意:
- 標籤後面的代碼會被依次執行,如上述代碼18行,如果不使用goto,那麼就會去執行19行後面的錯誤處理代碼了。
- 在含有大量goto語句時,應該按照“先跳後出”的準則去設計邏輯,因為通常在標籤處要做一些前面邏輯處理,越在前面聲明的變數或記憶體空間,越應該在最後去釋放,如前面的例子。其大概邏輯如下比如:
goto error:<br />……<br />goto checkNumError:<br />……<br />goto timeupError:<br />……</p><p>timeupError:<br />……<br />checkNumError:<br />……<br />error:<br />……</p><p>
++++++++++++++++++++++++++++++++++++++++++
《C語言深入理解系列 - 浪裡白條:goto》
查看其它博文請關注原創作者。
本文系本站原創,歡迎轉載! 轉載請註明出處:
http://blog.csdn.net/mr_raptor/article/details/7211005
++++++++++++++++++++++++++++++++++++++++++