2011-06-17 138 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这样的新变量,但是我认为这使得控制流程更易于阅读。