首页
/
每日頭條
/
生活
/
dowhile循環的用法c語言
dowhile循環的用法c語言
更新时间:2024-11-30 07:49:50

dowhile循環的用法c語言(C語言新手絕對不知道的do)1

C語言中do{...}while(0)的秒用

今天看了些有關do{...}while(0)秒用的文章,覺得寫的很好,這裡總結下分享給大家。

這裡分享的有3個用法,分别是:

1.避免空的宏定義在編譯時出現warning。

2.多個語句一起,定義成一個宏時,增加代碼适應(特别是條件語句調用這類宏要注意)

3.避免部分goto語句的使用

1.避免空的宏定義在編譯時出現warning

//例如:

#define foo() do{}while(0)

2.多個語句一起,定義成一個宏時,增加代碼适應(特别是條件語句調用這類宏要注意),以下if(0)和if(1)在實際應用時是if(表達式),表示表達式假和真。

//例如:一個宏包含以下兩個語句,

#define foo()

fun1();

fun2;

編譯器預處理的時候

if(1)foo();

//此時就相當于下面的語句,

if(0)fun1();

fun2();//邏輯上多執行的代碼,會導緻系統BUG

;//邏輯上多執行的代碼

如果使用do{...}while(0)就可以解決上面的問題

#define foo()

do{

fun1();

fun2();

}while(0)

//對于下面的語句

if(0) foo();

//編譯後的執行如下:

if(0) do{

fun1();

fun2();

}while(0);

這樣就不會出現上面那種有邏輯上不該執行的代碼被執行的問題。當然這裡也可以用其他方法避免這個問題,比如加大括号{}

#define foo() {fun1();fun2;}

編譯器會預處理下面語句

if(0) foo();

//編譯後的執行如下:

if(0) {

fun1();

fun2();

}

;//會多個;号,但是也沒有邏輯上的問題

語句塊宏定義時注意的就是這些,另外在寫if語句時,盡量後面要加大括号,避免出錯,例如上面的if(0){foo();},加上大括号{}也不會有問題。

3.避免部分goto語句的使用

//例如:如果一個函數要分配一些資源,然後中途遇到錯誤,要退出函數,退出前要釋放資源,代碼結構可能如下:

bool foo(){

int *p = (int*)malloc(5*sizeof(int));

bool bOk = true;

//執行并處理錯誤

bOk = fun1();

if(!bOk){

free(p);

p=NULL;

return false;

}

bOk = fun2();

if(!bOk){

free(p);

p=NULL;

return false;

}

bOk = fun3();

if(!bOk){

free(p);

p=NULL;

return false;

}

//......

//執行成功,釋放資源并返回ture

free(p);

p = NULL;

return true;

}

這裡就覺得很多代碼冗餘,然而使用溝通可以很好的解決冗餘的部分,代碼如下:

bool foo(){

int *p = (int*)malloc(5*sizeof(int));

bool bOk = true;

//執行并處理錯誤

if(!fun1()) goto errorlable;

if(!fun2()) goto errorlable;

if(!fun3()) goto errorlable;

//......

//執行成功,釋放資源并返回ture

free(p);

p = NULL;

return true;

//冗餘部分的,錯誤返回代碼

errorlable:

free(p);

p = NULL;

return false;

}

然後C語言中過多的使用goto語句會提高程序的靈活性,繁雜點的程序會讓程序員捉摸不定,程序跳來跳出,難以捉摸,容易邏輯上産生混淆從而出現BUG。對于上面的這種情況使用do{...}while(0)就可以很好的解決這些跳來跳出的問題,代碼結構如下:

bool foo(){

//分配資源

int *p = (int*)malloc(5*sizeof(int));

bool bOk = true;

//執行并處理錯誤

do{

bOk = fun1();

if(!bOk)break;

bOk = fun2();

if(!bOk)break;

bOk = fun3();

if(!bOk)break;

//......

}while(0);

//釋放資源并返回bOk

free(p);

p = NULL;

return bOk;

}

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
籃球比賽中罰球進籃得幾分
籃球比賽中罰球進籃得幾分
相信大家都知道,在籃球比賽中罰球中一次得1分。罰球是對場上運動員以及教練組成員的一種制約,也是對進攻方受到侵犯後的一種補償。一次罰球也就是給予一個隊員在罰球線後的半圓内,無争搶的情況下得1分的機會。籃球運動員可以用任何方式罰球,并且以這樣的...
2024-11-30
香鍋退役後發飙
香鍋退役後發飙
前導:香鍋退役後在RNG的公會做了遊戲主播,發展不算順利。一開始有不少人關注香鍋,直到跟他對戰的玩家賬号沒了,大家質疑香鍋故意封掉他們,甚至找上了聯盟要說法。解釋過後,香鍋依然被按上很多外号,比如“辣香”等等。彈幕很多人噴主播,香鍋不甘示弱...
2024-11-30
大連5遊客被困雪山
大連5遊客被困雪山
四川泸定6.8級地震發生後四川省地震局迅速派出現場工作隊緊急趕赴震區開展現場災害調查和烈度評定等工作由于震後道路損毀嚴重通往震中磨西鎮的道路幾乎中斷應急車隊不得不停在磨西河大橋附近等待通行時間一分一秒地過去現場交通狀況一直未能得到改善隊員們...
2024-11-30
複合地闆和實木地闆哪個比較實用
複合地闆和實木地闆哪個比較實用
感覺昨天的文章裡說的表面,今天跟大家說說實話吧。事實上,抛開價格談這兩者的實用性是有點耍流氓的,因為本來實木地闆就比複合地闆更好、更貴的。通俗點打個比喻,如果要買車,同樣是本田的車,問飛度好還是雅閣,毫無疑問是雅閣好,如果有錢的話。當然如果...
2024-11-30
宮爆老奶奶2适合女生玩嗎
宮爆老奶奶2适合女生玩嗎
《宮爆老奶奶II》是一款超火爆彈幕冒險手遊。玩家通過手指劃屏或重力感應的方式操控老奶奶撿取技能球,釋放技能與死神軍團戰鬥。獨特的俯視視角、Q萌角色造型以及七大奇迹副本等内容将帶你領略别樣的爽快遊戲體驗。毋庸置疑,戰鬥是《宮爆老奶奶II》的核...
2024-11-30
Copyright 2023-2024 - www.tftnews.com All Rights Reserved