sha*_*oth 5 c++ loops for-loop while-loop
好像
while( condition ) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
完全等同于
for( ; condition; ) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
有没有理由使用后者而不是前者?
Mic*_*fik 23
据我所知,没有充分的理由.你故意通过使用不增加任何东西的for循环误导人.
更新:
基于OP对该问题的评论,我可以推测你如何在实际代码中看到这样的结构.我以前见过(并且用过)了:
lots::of::namespaces::container::iterator iter = foo.begin();
for (; iter != foo.end(); ++iter)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是,就我而言,将事情排除在for-loop之外.也许你的项目有一个看起来像这样的循环.如果添加在循环中间删除容器元素的代码,则可能需要仔细控制iter增量的方式.这可能导致代码看起来像这样:
for (; iter != foo.end(); )
{
// do stuff
if (condition)
{
iter = foo.erase(iter);
}
else
{
++iter;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不是没有理由不将它变成一个while循环所需的五秒钟.
小智 8
一些编译器警告恒定的循环条件:
while (true) { /* ... */ } /* Warning! */
for (;;) { /* ... */ } /* No warning */
Run Code Online (Sandbox Code Playgroud)
在无限循环的特定情况下,出于这个原因,我可能会在while循环中选择for循环.但如果条件不是空的,我真的没有看到任何好处.我猜测它出现在上述项目中的原因是代码以某种方式通过维护而演变,但最初是以更传统的方式编写的.
有没有理由使用后者而不是前者?
可以编译
for(INIT; CONDITION; UPDATE)
{
BODY
}
Run Code Online (Sandbox Code Playgroud)
进入
{
INIT
while(CONDITION)
{
BODY
UPDATE
}
}
Run Code Online (Sandbox Code Playgroud)
更新:看起来多余的额外范围是将INIT中的所有变量定义都包含在内,即from for(int i = 0; ...)。谢谢!
基本上,这只是表达式的重新排序。因此,出于性能方面的考虑,没有理由优先选择一个。我建议,while()如果可能的话,因为它更简单。如果一个更简单的构造表达了您想要做的事情,那么我认为这就是要使用的构造。