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

时间:2009-09-04 13:26:58

标签: c++ loops for-loop while-loop

看起来像

while( condition ) {
    //do stuff
}

完全等同于

for( ; condition; ) {
    //do stuff
}

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

17 个答案:

答案 0 :(得分:23)

据我所知,没有良好的原因。你故意通过使用不增加任何东西的for循环误导人。

<强>更新

根据OP对该问题的评论,我可以推测您如何在实际代码中看到这样的构造。我之前见过(并且使用过):

lots::of::namespaces::container::iterator iter = foo.begin();
for (; iter != foo.end(); ++iter)
{
    // do stuff
}

但就我所说的那样,将事情从for-loop中删除。也许你的项目有一个看起来像这样的循环。如果添加在循环中间删除容器元素的代码,则可能必须仔细控制iter递增的方式。这可能导致代码看起来像这样:

for (; iter != foo.end(); )
{
    // do stuff

    if (condition)
    {
        iter = foo.erase(iter);
    }
    else
    {
        ++iter;
    }
}

然而,没有理由不花费五秒钟将其变成一个while循环。

答案 1 :(得分:8)

一些编译器警告恒定的循环条件:

while (true) { /* ... */ } /* Warning! */
for (;;) { /* ... */ } /* No warning */

在无限循环的特定情况下,我可能因为这个原因选择for循环。但如果条件不是空的,我真的没有看到任何好处。我猜测它出现在上述项目中的原因是代码以某种方式通过维护而演变,但最初是以更传统的方式编写的。

答案 2 :(得分:6)

没有。没有。

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

答案 3 :(得分:6)

  

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

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

答案 4 :(得分:4)

据我所知,编译器将这两个语句优化为相同的assember代码..所以不,没有理由这样做 - 只是个人偏好。

答案 5 :(得分:4)

可以编译

for(INIT; CONDITION; UPDATE)
{
  BODY
}

{
  INIT
  while(CONDITION)
  {
    BODY
    UPDATE
  }
}

更新:看似多余的额外范围是在INIT中保留任何变量定义,即来自for(int i = 0; ...)。谢谢!

它基本上只是对表达式的重新排序。因为性能原因,没有理由偏爱另一个。如果可能,我会建议while(),因为它更简单。如果一个更简单的结构表达了你想要做的事情,我认为这是一个可以使用的结构。

答案 6 :(得分:2)

在这种情况下,我个人更喜欢第一个循环,因为它更容易编写和阅读。

但是如果我有一个需要一些post语句的循环,我会像这样使用for循环:

for (; i < 10; i += 2)

答案 7 :(得分:2)

在程序集级别上可能存在与编译器相关的小差异,但理想情况下两者应该完全相同,前者更具可读性。所以不,除了不符合规范之外,使用后一版本没有共鸣。

答案 8 :(得分:2)

编译两者并检查生成的反汇编,如果它们相同(可能是它们)。选择你觉得最易读的那个。

答案 9 :(得分:2)

我认为“while”和“for”循环适用于不同的习语。使用“while”的习语是“做某事,而某些条件是真的”。 “for”的习语是“迭代一定范围的元素”......

每当我阅读代码时,我都会期待这些习语(我想我并不孤单)。当我看到“for”时,我理解,有人在某个范围内进行迭代,我不会详细介绍。当我看到for循环,用于另一个成语(不是那个,我期待),我感到困惑,不得不详细说明。

无论如何,这是非常主观的......

答案 10 :(得分:1)

我可以看到两个原因,我不会考虑这两个原因:

  • 只有1个循环结构,但是Kristo的异议就是
  • 写“for(; EVER;)”,但如果真的想要这个,则更喜欢LOOP_FOREVER宏。

答案 11 :(得分:1)

这个问题已得到解答 - 该语言有一个更自然的结构来表达你想要的东西 - 你应该使用它。例如,我当然可以这样写:

for (bool b = condition(); b; b = !b) {
    /* more code */
}

或:

while (condition()) {
    /* more code */
    break;
}

而不是更传统的:

if (condition()) {
    /* more code */
}

但为什么呢? C(和所有语言)都有成语,其中大多数在表达性和意义期望方面具有理性意义。当你用这个成语嘀咕时,你就会对那些必须阅读你代码的人的敏感性感到困惑。

答案 12 :(得分:1)

我曾经写过一些非常神秘的C / C ++代码。回顾过去,我可能会在一个循环中执行此操作:

ifstream f("file.txt");
char c;
for(f.get(c); !f.eof(); f.get(c)) {
  // ...
}

我想我的观点是for循环通常更短但可读性更低,如果它们没有在传统意义上的循环范围内使用。

答案 13 :(得分:1)

您可能希望使用do-while循环而不是for循环,因此在检查和满足(或不符合)条件之前,代码至少处理一次。

答案 14 :(得分:1)

for(; cond;)循环和while循环之间的C-ish语言确实没有区别。一般来说,我在C-ish语言中所做的就是开始将循环写为“for”,如果我最终得到那个形式,则将其更改为“while”。这有点罕见,因为你总是在迭代某些东西,而C允许你在最后一个区域放置你想要的任何代码。

如果C对循环有真实(预先计算的迭代),那将会有所不同。

答案 15 :(得分:1)

在一段时间内保持可读性,不同循环之间通常没有性能差异。至少没有显着差异。

对于桌面应用程序,您可以根据可读性标准进行选择。请参阅其他帖子 - 例如看着for循环,有人认为递增器是在循环中声明的。

似乎对于网络应用程序,例如客户端脚本可能会有所不同。

检查此网站:http://www.websiteoptimization.com/speed/10/10-2.html

运行您自己的实验,然后通过可读性规则继续执行结果。

答案 16 :(得分:1)

如果你想做一些有限次数的事情,那么“for”让你指定约束而不用你的循环中的逻辑混淆它。