2012-09-27 21 views
0

我需要一些想法來使這個程序更具可讀性。我認爲這更多的是關於設計師的問題。如何在循環之後使用goto和run語句來取消兩個循環?

我有兩個循環:

for(...) { 
    //... 
    for(...) { 
    if(baa) { 
     goto outer; 
     } 
     //statements of 2-loop 
    } 
    //statements of 1-loop 
} 

它工作正常,如果baa具有非零值,跳轉到outer標籤無環1和2的運行stataments但return之前,我需要做一些free()通話獨立,如果goto outer被稱爲:

if(a != NULL) free(a); 
if(b != NULL) free(b); 

,但如果我在這裏,因爲goto,上面的代碼沒有被調用。

我需要做到以下幾點:

goto outer; //if normally exited from two-loops, go to outer anyway. 

    outer: { 
    if(a != NULL) free(a); 
    if(b != NULL) free(b); 
     return ret; 
    } 

是什麼讓函數是這樣的:

char* foo(void) { 
    char *ret = NULL; 

    for(...) { 
    //... 
    for(...) { 
    if(baa) { 
     ret = tmp_result; 
     goto outer; 
     } 

     //some statements of 2-loop 
    } 
     //some statements of 1-loop 
    } 

    goto outer; 

    outer: { 
    if(a != NULL) free(a); 
    if(b != NULL) free(b); 
     return ret; 
    } 
} 

我希望這是顯而易見的。提前致謝。

+0

在循環外部不需要'goto outer;','outer:'-labelled語句在退出循環後仍然執行。 –

+0

@DanielFischer:真的。我忘了它!非常感謝。發佈它作爲答案,我會接受 – Jack

回答

3

outer標籤被正常控制流程忽略,它只被用作goto的目標,所以在循環之後你不需要它。此外,沒有必要到組的標籤爲複合語句之後的語句,

char* foo(void) { 
    char *ret = NULL; 

    for(...) { 
    //... 
    for(...) { 
    if(baa) { 
     ret = tmp_result; 
     goto outer; 
     } 

     //some statements of 2-loop 
    } 
     //some statements of 1-loop 
    } 

    outer: 
    if(a != NULL) free(a); 
    if(b != NULL) free(b); 
    return ret; 
} 

不完全一樣的(並且是IMO更好一點的眼睛)。