資源描述:
《do...while(0) do...while(false)的妙用》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、do...while(0)do...while(false)的妙用?在C++中,有三種類型的循環(huán)語句:for,while,和do...while,但是在一般應用中作循環(huán)時,我們可能用for和while要多一些,do...while相對不受重視。?但是,最近在讀我們項目的代碼時,卻發(fā)現(xiàn)了do...while的一些十分聰明的用法,不是用來做循環(huán),而是用作其他來提高代碼的健壯性。1.do...while(0)消除goto語句。通常,如果在一個函數(shù)中開始要分配一些資源,然后在中途執(zhí)行過程中如果遇到錯誤則退出函數(shù),當然,退出前先
2、釋放資源,我們的代碼可能是這樣:version1[cpp]viewplaincopy1.bool?Execute()??2.{??3.???//?分配資源??4.???int?*p?=?new?int;??5.???bool?bOk(true);??6.??7.???//?執(zhí)行并進行錯誤處理??8.???bOk?=?func1();??9.???if(!bOk)???10.???{??11.??????delete?p;?????12.??????p?=?NULL;??13.??????return?false;??1
3、4.???}??15.??16.???bOk?=?func2();??17.???if(!bOk)???18.???{??19.??????delete?p;?????20.??????p?=?NULL;??21.??????return?false;??22.???}??23.??24.???bOk?=?func3();??25.???if(!bOk)???1.???{??2.??????delete?p;?????3.??????p?=?NULL;??4.??????return?false;??5.???}??6
4、.??7.???//?..........??8.??9.???//?執(zhí)行成功,釋放資源并返回??10.????delete?p;?????11.????p?=?NULL;??12.????return?true;??13.?????14.}??這里一個最大的問題就是代碼的冗余,而且我每增加一個操作,就需要做相應的錯誤處理,非常不靈活。于是我們想到了goto:version2[cpp]viewplaincopy1.bool?Execute()??2.{??3.???//?分配資源??4.???int?*p?=?new?
5、int;??5.???bool?bOk(true);??6.??7.???//?執(zhí)行并進行錯誤處理??8.???bOk?=?func1();??9.???if(!bOk)?goto?errorhandle;??10.??11.???bOk?=?func2();??12.???if(!bOk)?goto?errorhandle;??13.??14.???bOk?=?func3();??15.???if(!bOk)?goto?errorhandle;??16.??17.???//?..........??18.??19.?
6、??//?執(zhí)行成功,釋放資源并返回??20.????delete?p;?????21.????p?=?NULL;??22.????return?true;??23.??1.errorhandle:??2.????delete?p;?????3.????p?=?NULL;??4.????return?false;??5.?????6.}??代碼冗余是消除了,但是我們引入了C++中身份比較微妙的goto語句,雖然正確的使用goto可以大大提高程序的靈活性與簡潔性,但太靈活的東西往往是很危險的,它會讓我們的程序捉摸不定,那么
7、怎么才能避免使用goto語句,又能消除代碼冗余呢,請看do...while(0)循環(huán):version3[cpp]viewplaincopy1.bool?Execute()??2.{??3.???//?分配資源??4.???int?*p?=?new?int;??5.??6.???bool?bOk(true);??7.???do??8.???{??9.??????//?執(zhí)行并進行錯誤處理??10.??????bOk?=?func1();??11.??????if(!bOk)?break;??12.??13.??????bO
8、k?=?func2();??14.??????if(!bOk)?break;??15.??16.??????bOk?=?func3();??17.??????if(!bOk)?break;??18.??19.??????//?..........??20.??21.???}while(0);??22.??23.????//?釋放資