有没有理由用C++中的for(; condition;)替换while(condition)?

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循环.但如果条件不是空的,我真的没有看到任何好处.我猜测它出现在上述项目中的原因是代码以某种方式通过维护而演变,但最初是以更传统的方式编写的.


Joh*_*McG 8

有没有理由使用后者而不是前者?

  1. 误导你的同事,你知道这两种形式是相同的.
  2. 一种愚蠢的策略,通过使代码尽可能混淆来确保"工作安全",以便没有人愿意改变它.
  3. 键盘上的"w"键坏了.
  4. 它起初是带有初始化器和递增条件的for循环,当逻辑发生变化时,开发人员太忙而无法改变它.

  • 为#3 +1!(添加更多字符使其超过15) (2认同)

Mik*_*vey 7

不不不.

即使存在微观的性能差异,你也必须成为一个终极级的Jedi性能调谐器才能让它足够关注.

  • 应该是西斯性能调谐器.因为像这样的所有代码级优化都是邪恶的. (3认同)

unw*_*ind 5

可以编译

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()如果可能的话,因为它更简单。如果一个更简单的构造表达了您想要做的事情,那么我认为这就是要使用的构造。

  • 请记住,在后一种情况下,“ continue”语句具有不同的语义。 (3认同)
  • INIT的范围有所不同。 (3认同)