11

continue为什么如果我在循环中使用它往往会进入无限循环while,但在循环中可以正常工作for?如果我在之后使用
循环计数器增量,它i++会在循环中被忽略,但如果它在循环中,它会起作用。whilecontinuefor

如果continue忽略后续语句,那么为什么不忽略for循环的第三条语句,其中包含计数器增量i++?鉴于循环的第三条语句是在循环体之后for执行的循环的第三条语句不是continue也应该忽略吗?for

while(i<10)   //causes infinite loop
{
    ...
    continue
    i++
    ...
}

for(i=0;i<10;i++)  //works fine and exits after 10 iterations
{
    ...
    continue
    ...
}
4

8 回答 8

28

因为continue回到循环的开始。使用for,后操作i++是循环控制的一个组成部分,在循环体重新启动之前执行。

使用while, thei++只是循环体中的另一个语句(与类似的语句没有什么不同a = b),如果您continue在到达它之前跳过它。

于 2013-05-16T22:06:16.980 回答
11

原因是该continue语句会使循环体中紧随其后的语句短路。由于您编写while循环的方式在语句后面有增量语句continue,因此它会短路。您可以通过更改while循环来解决此问题。

许多教科书声称:

for (i = 0; i < N; ++i) {
    /*...*/
}

相当于:

i = 0;
while (i < N) {
    /*...*/
    ++i;
}

但是,实际上,它真的是这样的:

j = 0;
while ((i = j++) < N) {
    /*...*/
}

或者,更迂腐一点:

i = 0;
if (i < 10) do {
    /*...*/
} while (++i, (i < 10));

这些更等效,因为现在如果 的主体while具有 a continue,则增量仍然会发生,就像在 a 中一样for。后一种选择只在迭代完成后执行增量,就像for(前者在迭代之前执行增量,推迟到迭代i之后保存它)。

于 2013-05-16T22:26:15.510 回答
3

你的增量i是在继续之后,所以它永远不会被执行

while(i<10)   //causes infinite loop
{
.........
continue
i++
......
}
于 2013-05-16T22:05:05.490 回答
2

在任何循环中, continue 将执行移回循环顶部,在 continue 语句之后不执行任何其他指令

在这种情况下,总是执行 for 循环的定义(根据标准 C),而 i++; 语句未执行,因为它出现在 continue 语句之后。

于 2013-05-16T22:05:31.387 回答
0

continue如果满足循环的条件,则绕过块的其余部分并从块的顶部重新开始。

下一个问题是:“那我该怎么办?” 我能想到的答案有两个。

例子:

void foo ()
{
    size_t i = 0;
    do
    {
        /*...*/
        if ( /*...*/ )
        {
            /*...*/
            continue;
        }
        /*...*/
        i++;
    } while ( /* loop conditional */ );
}

解决方案#1:手动递增

void foo ()
{
    size_t i = 0;
    do
    {
        /*...*/
        if ( /*...*/ )
        {
            /*...*/
            i++;
            continue;
        }
        /*...*/
        i++;
    } while ( /* loop conditional */ );
}

解决方案 #2:goto *的唯一有效应用

void foo ()
{
    size_t i = 0;
    do
    {
        /*...*/
        if ( /*...*/ )
        {
            /*...*/
            goto foo_next;
        }
        /*...*/
foo_next:
        i++;
    } while ( /* loop conditional */ );
}

goto在这种情况下是有效的,因为在两个地方的增量在技术上是相同的指令。当 per-iteration-volatile 变量更复杂时,此解决方案尤其重要;例如,设置多个变量或使用方程式或函数修改值。

在单个增量或减量语句的情况下,解决方案 #1 可能证明是有利的;但是,应该注意的是:如果在这样的实现之后修改了代码,必须记住更新语句的两个实例(这可能容易出现错误,特别是如果修改发生在很长一段时间后** )。因此,我强烈推荐解决方案 #2。

*有些人认为任何和所有使用goto不良做法。我建议您自己决定,并留给您:google for "c goto bad"

**提醒这种必要性的评论可能就足够了,但是——如果我的建议被遵循——每迭代易失性变量被限制在一个语句中。我引用:

从来没有理由评论一行

-Linus Torvalds(来源:http: //yarchive.net/comp/linux/coding_style.html

于 2015-04-03T05:30:44.903 回答
0

因为 for 的第三部分总是被执行。

于 2013-05-16T22:04:37.220 回答
0

for 循环包含条件语句和增量,因此当条件满足时,它会在 for 循环内执行语句,但如果写 continue 语句,它将再次到达 for 循环的第一行,即增量和条件语句检查,如果满足而不是再次进入执行。对于 while 循环,它只检查条件语句,如果条件满足,则执行 while 循环中的语句。所以 continue 不会在它之后执行任何行。因此你的条件每次都满足并进入无限循环。

于 2015-03-17T04:05:25.923 回答
0

continue语句将控制跳转到循环当前迭代中的语句末尾,即它跳过当前迭代中语句的执行并移动到循环的下一个迭代。

使用while循环,continue语句会导致控制到达语句的末尾(包括增量语句),从而导致循环永远继续。

使用for循环,continue语句将控制跳转到语句的末尾并执行增量语句(在for循环中,增量语句被认为与循环体内编写的语句是分开的)。

于 2014-02-20T08:50:09.630 回答