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)