2011-06-17 137 views
2
for (int i = 0; i<10; i++) 
{ 
    //do some validation for record length 

    //if it is not valid 

    continue; // goes to the next iteration in for loop for 'i' 

    for (int j = 0; j<5; j+=2)  
    { 

    //do some more validation for individual record 

    //if it is not valid 

這應該進入下一個i如果我使用continue。在這裏它會去下一個j 任何人都可以讓我知道如何做到這一點?如何退出(去父循環的下一個元素)for循環裏面一個for循環

回答

2

您需要在外環具體測試一個標誌,如果是內部循環後的東西:

for(some_outer_vars){ 
    bool should_skip = false; 
    // ... 
    for(some_inner_vars){ 
    // ... 
    if(your_condition){ 
     should_skip = true; 
     break; 
    } 
    } 
    if(should_skip) 
    continue; 
    // ... 
} 
1

內循環之後你有什麼東西嗎?如果沒有,你可以只使用break

for (i = 0; i < 10; i++) 
{ 
    if (i is no good) 
    continue; 

    for (j = 0; j < 5; j++) 
    { 
    if (j is no good) 
     break; 
    } 
} 

如果以後需要做的事情,你可以結合使用break與其他一些標誌。

2

j循環內使用break;將完全退出j循環。

但是至少花幾分鐘時間來決定替代算法,方法或終止條件是否可以消除在循環中斷的需要。

0

代替break;。這應該讓你走出內部循環。

0

的for(int i = O;我< 10;我++) {

}

對(INT J = 0;Ĵ< 5; J + = 2){ 破 ; }

「break;」將結束你當前的j循環並轉到下一個i。

0

如果您不能安排的邏輯,這樣break在內環獲得直繼續外循環,然後做到這一點:

for (int i = 0; i<10; i++) 
{ 
    if (!valid(i)) continue; 
    for (int j = 0; j<5; j+=2)  
    { 
     if (!valid(i,j)) goto continue_i; 
     do_whatever_with_i_and_j() 
    } 
    more_stuff_here(); 
continue_i: 
} 

在那裏,我已經說過了。與設置標誌的版本相比,代碼更短,更簡單,更易於閱讀和更易於分析,然後中斷,然後立即再次檢查標誌並有條件地繼續。

另一種選擇是這

void inner_loop(int i) { 
    if (!valid(i)) return; 
    for (int j = 0; j<5; j+=2)  
    { 
     if (!valid(i,j)) return; 
     do_whatever_with_i_and_j() 
    } 
    more_stuff_here(); 
} 

for (int i = 0; i<10; i++) 
{ 
    inner_loop(i); 
} 

根據內環做什麼,不過,你可能會發現自己建立一個相當的機制給它訪問任何它應該修改。

社區wiki,因爲這個(或類似的情況)已經在SO上爭論過很多次,以至於實際上定義了「主觀和論證性」。

0

我試圖避免中斷並繼續處理循環,因爲它們很容易遺漏,如果稍後必須重構代碼,它們的含義會改變。你可以使用j = 5;當你需要退出內部循環時。如果添加第三個循環或開關,則該行的含義不會改變。有時你需要在你的循環中添加if語句來測試i和j,甚至是像bool iIsInvalid這樣的新變量,但是我認爲這使得控制流程更易於閱讀。