与计数器一样使用

时间:2014-10-22 20:40:37

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

大多数情况下,while循环用于检查while循环体中发生的事件。并且主要用于"确定"给出了迭代次数。让我们假设我们需要知道我们所处的迭代次数,一般来说:

General While循环:

bool flag = false;
int it = 0;
while (!flag)
{ 
    //... do something using it
    ++it;
    flag = getFlag();
}

General For循环,迭代次数是循环的固有值:

for(int it = 0; it < N; ++it)
{
    //... do something using it
    if (getFlag())
        break;
}

但是,对于没有设置迭代次数的情况(也就是说,我们循环直到偶数发生)我从未见过像这样的东西:

for(int it = 0; !getFlag(); ++it)
{
    //...do something using it
}

但我总是看到像我写的第一个while循环。有什么真正的区别吗?在while循环中它被认为是更好的风格吗?因为对我来说,for循环更紧凑,易于阅读和遵循。

6 个答案:

答案 0 :(得分:6)

通常你应该使用你认为最具可读性的那些,但要注意这两种结构之间存在差异可能会让你措手不及:continue的行为。

continue不会使用it构造增加while,但会使用for构造增加它。

while (!getFlag()) {
    // ...

    if (something) {
        // "it" won't be incremented!
        continue;
    }

    // ...

    ++it;
}

for(int it = 0; !getFlag(); ++it) {
    // ...

    if (something) {
        // "it" will be incremented!
        continue;
    }

    // ...
}

如果您没有使用continue,那么行为将是相同的,但您无法做出for (a; b; c) { d; }完全等同于{ a; while (b) { d; c; } }的一般声明,除非您添加限制d不能包含continue声明。

答案 1 :(得分:3)

您描述的while()和for()循环之间的执行没有区别。没有一个更好或更优雅的标准或共同惯例。坚持使用你觉得更舒适的工作。

答案 2 :(得分:2)

  

有什么真正的区别吗?

没有。除了变量范围和continue的含义之外,这些完全相同:

initialize;
while (condition) {
  body;
  increment;
}

for (initialize; condition; increment) {
  body;
}
  

while循环被认为是更好的风格吗?

正如您所提到的,每种类型的循环都有典型的用例:

  • 如果您有一些初始化,测试和增量,请使用for循环。不一定是已知的迭代次数;典型的C ++模式是在i != some_container.end()时迭代。我认为您的上一个示例可以正常用作for循环。

  • 如果您不需要初始化和增量,请使用while循环。写for (; condition;)只是愚蠢。

然而,有灰色区域,其中任何一种类型的循环都有意义。这主要取决于个人偏好。

答案 3 :(得分:1)

以上所有情况都是有效的,在我的书中完全没问题(假设您打算在第一种情况下设置flag = true;,或者至少不是false,因为它永远不会进入循环)。

我有时会使用:

 for(int i = 0; ; i++)
 {
    ...
    if (getFlag()) break;
    ... 
 }

另一个最受欢迎的是典型的#34;链表循环&#34;:

for(Node* p = head; p; p = p->next)
{
    ... Do stuff with p ... 
}

在很大程度上,这取决于你实际想要表达的内容......

编译器很可能为这三个代码生成相同或至少非常相似的代码。

答案 4 :(得分:1)

事实是

for (exp1; exp2; exp3) {
   statements;
}

相当于

{   // I put the brace, because exp1 may be a declaration of variable local to the loop
   exp1; 
   while (exp2) {
      statements;  // as long as there is no continue (or if you replace every continue; with { exp3; continue; } 
      exp3; 
   }
}

所以这是一个品味问题,具有循环特定的初始化和增量表达式,以及使用continue语句的方式。

然而,您的分析是准确的:for经常用于迭代,因为c ++ 11范围显示:

for (x : container) {
   statements; 
}

原因(至少根据B.Stroustrup)是,迭代的所有控制逻辑都可以很容易地在循环顶部的一个可见位置重新分组。

答案 5 :(得分:0)

虽然我同意大多数人的意见并没有什么大不同(实际上在大多数情况下,他们实际上会编译成相同的代码)。在循环结束时,内部操作(迭代器除外)可能会发生变化的情况下,我总是被告知不要使用for循环。这是为了可读性。