天天看點

do{...}while(false)的用法

    今天看代碼時發現個不太了解的風格,一些代碼都分段包含在了do{...}while(false)區間裡。一般來說,使用do while是為了循環,但這裡循環條件是false,根本就不會有循環,那麼意義何在?

    上網查了下後得到結論:使用do{...}while(false)結構可以簡化多級判斷時代碼的嵌套。

     舉個例子:現在要實作一個功能,但需要A、B、C、D四個前提條件,并且這四個前提條件都存在上級依賴,即B依賴于A,C依賴于A和B,D依賴于A、B和C。如果按照一般的寫法,是這樣:

if( A==true )
{
    if( B==true )
    {
        if( C==true )
        {
            if( D==true )
            {
                //實作功能代碼
            }
        }
    }
}
           

    可能看出來,這樣導緻多層if語句嵌套,看起來邏輯很不清晰。

    一種解決的辦法是使用goto語句,當某個條件不成立時,直接跳轉到之後的語句段,形如這樣:

if( A==false )
    goto tag;
if( B==false )
    goto tag;
if( C==false )
    goto tag;
if( D==false )
    goto tag;
//實作功能代碼

tag:
...
           

    這樣看起來風格是好多了,但使用goto語句會有很多隐患,一般是不建議用的。

    其實使用do while語句也可以實作類似goto的功能,但代碼可讀性會比goto風格好很多。代碼如下:

do
{
    if( A==false )
        break;
    if( B==false )
        break;
    if( C==false )
        break;
    if( D==false )
        break;
    //實作功能代碼
}while(false);
...
           

    這樣就可以明白了: 在 do{...}while(false)中的代碼段,可以用break的方式實作類似goto的跳轉功能,在實際工程中很有使用價值。