为什么'continue'语句忽略'while'循环中的循环计数器增量,而不是'for'循环?

Tho*_*hom 8 c loops for-loop continue while-loop

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

如果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
    ...
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 24

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

有了while,这i++只是循环体中的另一个陈述(与类似的东西没什么不同a = b),如果你continue在到达它之前就跳过了.


jxh*_*jxh 10

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

很多教科书声称:

for (i = 0; i < N; ++i) {
    /*...*/
}
Run Code Online (Sandbox Code Playgroud)

相当于:

i = 0;
while (i < N) {
    /*...*/
    ++i;
}
Run Code Online (Sandbox Code Playgroud)

但是,实际上,它真的像:

j = 0;
while ((i = j++) < N) {
    /*...*/
}
Run Code Online (Sandbox Code Playgroud)

或者,更迂腐:

i = 0;
if (i < 10) do {
    /*...*/
} while (++i, (i < 10));
Run Code Online (Sandbox Code Playgroud)

这些更相同,因为现在如果while有一个主体continue,增量仍然会发生,就像在a中一样for.后一替代方案仅在迭代完成后执行增量,就像for(前者在迭代之前执行增量,延迟将其保存i到迭代之后).