日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言do...while语句的妙用(包裹宏替换多句代码)(代替go to语法)(隔绝外部变量)

發(fā)布時(shí)間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言do...while语句的妙用(包裹宏替换多句代码)(代替go to语法)(隔绝外部变量) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 使用do...while(0)的好處
    • > 輔助定義復(fù)雜的宏,避免引用的時(shí)候出錯(cuò),提高代碼健壯性
    • > 消除分支語句或者goto語句,提高代碼的易讀性
    • > 使用代碼塊,代碼塊內(nèi)定義變量,不用考慮變量重復(fù)問題

使用do…while(0)的好處

在C++中,do…while 通常是用來做循環(huán)用的,然而我們做循環(huán)操作可能用for和while要多一些。經(jīng)常看到一些開源代碼會(huì)出現(xiàn)do…while(0)這樣的代碼,這樣的代碼看上去肯定不是用來做循環(huán)的,那為什么要這樣用呢?

實(shí)際上do…while(0)的作用遠(yuǎn)大于美化代碼,現(xiàn)總結(jié)起來主要有以下幾個(gè)作用:

> 輔助定義復(fù)雜的宏,避免引用的時(shí)候出錯(cuò),提高代碼健壯性

假設(shè)你需要定義一個(gè)這樣的宏:

#define DOSOMETHING()\ func1();\func2();

這個(gè)宏的本意是,當(dāng)調(diào)用DOSOMETHING()時(shí),函數(shù)func1()和func2()都會(huì)被調(diào)用。但是如果你在調(diào)用的時(shí)候這么寫:

if(a>0)DOSOMETHING();

因?yàn)楹暝陬A(yù)處理的時(shí)候會(huì)直接被展開,你實(shí)際上寫的代碼是這個(gè)樣子的:

if(a>0)func1();func2();

這就出現(xiàn)了問題,因?yàn)闊o論a是否大于0,func2()都會(huì)被執(zhí)行,導(dǎo)致程序出錯(cuò)。

那么僅僅使用{}將func1()和func2()包起來行么?

我們?cè)趯懘a的時(shí)候都習(xí)慣在語句右面加上分號(hào),如果在宏中使用{},代碼里就相當(dāng)于這樣寫了:“{…};”,假如有以下代碼:

#define DOSOMETHING(){\ func1();\func2();} ... if(a>0)DOSOMETHING(); else... ...

展開后就是這個(gè)樣子:

if(a>0) {func1();func2(); }; else...

這樣是不會(huì)編譯通過。所以,很多人才采用了do{…}while(0);

#define DOSOMETHING() \ do{ \func1();\func2();\}while(0)\... if(a>0)DOSOMETHING(); else... ...

> 消除分支語句或者goto語句,提高代碼的易讀性

如果在一個(gè)函數(shù)中開始要分配一些資源,然后在中途執(zhí)行過程中如果遇到錯(cuò)誤則退出函數(shù),當(dāng)然,退出前先釋放資源,我們的代碼可能是這樣:

bool Execute() {// 分配資源int *p = new int;bool bOk(true);// 執(zhí)行并進(jìn)行錯(cuò)誤處理bOk = func1();if(!bOk) {delete p; p = NULL;return false;}bOk = func2();if(!bOk) {delete p; p = NULL;return false;}bOk = func3();if(!bOk) {delete p; p = NULL;return false;}// ..........// 執(zhí)行成功,釋放資源并返回delete p; p = NULL;return true;}

這里一個(gè)最大的問題就是代碼的冗余,而且我每增加一個(gè)操作,就需要做相應(yīng)的錯(cuò)誤處理,非常不靈活。于是我們想到了goto:

bool Execute() {// 分配資源int *p = new int;bool bOk(true);// 執(zhí)行并進(jìn)行錯(cuò)誤處理bOk = func1();if(!bOk) goto errorhandle;bOk = func2();if(!bOk) goto errorhandle;bOk = func3();if(!bOk) goto errorhandle;// ..........// 執(zhí)行成功,釋放資源并返回delete p; p = NULL;return true;errorhandle:delete p; p = NULL;return false;}

代碼冗余是消除了,但是我們引入了C++中身份比較微妙的goto語句,雖然正確的使用goto可以大大提高程序的靈活性與簡(jiǎn)潔性,但太靈活的東西往往是很危險(xiǎn)的,它會(huì)讓我們的程序捉摸不定,那么怎么才能避免使用goto語句,又能消除代碼冗余呢,請(qǐng)看do…while(0)循環(huán):

bool Execute() {// 分配資源int *p = new int;bool bOk(true);do{// 執(zhí)行并進(jìn)行錯(cuò)誤處理bOk = func1();if(!bOk) break;bOk = func2();if(!bOk) break;bOk = func3();if(!bOk) break;// ..........}while(0);// 釋放資源delete p; p = NULL;return bOk;}

> 使用代碼塊,代碼塊內(nèi)定義變量,不用考慮變量重復(fù)問題

當(dāng)你的功能很復(fù)雜,變量很多你又不愿意增加一個(gè)函數(shù)的時(shí)候,使用do{}while(0);,將你的代碼寫在里面,里面可以定義變量而不用考慮變量名會(huì)同函數(shù)之前或者之后的重復(fù)。

參考文章:使用do…while(0)的好處

總結(jié)

以上是生活随笔為你收集整理的C语言do...while语句的妙用(包裹宏替换多句代码)(代替go to语法)(隔绝外部变量)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。