do while false 結構的妙用

2021-10-14 15:25:19 字數 1040 閱讀 6282

今天看原始碼的時候,發現某個框架的原始碼裡面經常出現如下片段:

do

}while

(false

)

我對於do{} while(false)結構的使用,在此之前無非兩種,第一種是基本用法,也就是把它當成迴圈結構使用,和for(;;)while(){}沒太大區別;還有一種用法是用在巨集定義中,如下所示:

#define larger(x,y) do 

while

(false

)

這種方法在巨集定義中很討巧,因為巨集定義在c/c++中是簡單的字元替代,經常會出現字元替代過程**現的語義問題,如:

#define larger(x,y) x > y? x:y

int a =2*

larger(10

,30);

此時我們本來期望a = 60,其實因為字元替代的原因,實際上是int a = 2 * x > y?x:y =30。這就是bug的源頭之一。通過do while(false)結構,能對macro_code進行很好的分割。

然而,這個結構還有乙個好處,其本質是乙個迴圈結構,意味著它可以提前break,在多條件判斷的環境下是乙個作為對goto的很好的取代。如:

doif(

is_exist

(path)

)// the residual code you need , the main stream

}while

(false

)

通過這種手段,基於作為入口條件判斷,如果一旦不符合條件,可以直接break,跳到迴圈之外,這相當於很好地應用了goto的功能,而沒有引入goto的負作用(全域性跳轉,難以維護)。

[1].

do while false 技巧揭密

do dwsize msg hdr len dwstatus gu recvall sessionsocket szprotobuffer,dwsize if 0 dwstatus if pmsghdr dwacknumber dwacknumber if pmsghdr dwretstatus 0...

do while false 實用技巧

今天看專案原始碼的時候發現有些地方用了do while false 的用法,查了下發現這樣確實有些優點,mark下。1.最重要的優點,用在略微複雜的巨集定義中。define ab1 a b x,下面語句b不能被執行 if cond ab1 define ab2 x,下面語句編譯出錯 if cond ...

邏輯結構,儲存結構,物理結構的區分

邏輯結構 是指資料元素之間的邏輯關係,從邏輯關係上描述資訊。儲存結構 又稱物理結構 資料結構在計算機中的表示 又稱映像 很好理解,但是光靠這些官話,做題保準做乙個錯乙個 不信?下面放一道題 線索二叉樹是一種 結構?a.邏輯 b.邏輯和儲存 c.物理 d.線性 是不是一般人都會想選a,猶豫一點的會想選...