这个for循环不应该有错误吗?

时间:2015-02-18 04:24:39

标签: c++ for-loop

我正在阅读我的数据结构书,看到一些与我不相符的代码。我认为我对for循环的想法是错误的。有人可以帮忙吗?

void percolateDown(int hole){

    int child;
    Comparable tmp = array[hole];
     // my problem is that child is not initialized to a value until inside for loop how is hole = child possible! 
    for(; hole * 2 <= currentSize; hole = child){
          child = hole * 2;  
         //code that does percolate up
    }

    array[hole] = tmp; 
}

这段代码是对的我只删除了里面不必要的代码。你可能已经猜到了,但它是一种在堆中渗透的方法。

我的问题是,直到for循环内部才给孩子一个值,那么for循环如何在其中声明hole = child呢?

我的假设是for循环中的所有内容都在第一次迭代之前或第一次迭代时运行。

4 个答案:

答案 0 :(得分:3)

for循环的最后一部分仅在循环完成第一次迭代后执行。因此,它首先设置孩子,然后给孩子分配洞。

答案 1 :(得分:3)

在执行循环体之后执行hole = child赋值,因此在执行循环时,child已被赋值。

首先,循环等同于:

int child;
while (hole * 2 <= currentSize)
{
    child = hole * 2;
    hole = child;
}

(这是第一次近似,因为breakcontinue的行为无法通过显示的音译进行捕捉 - 但您的代码无论如何都没有。)

您只需使用child作为循环体即可避免hole *= 2;

答案 2 :(得分:2)

[pmt.for]中的

C ++11§6.5.3/ 1:

  

for声明

     

for ( for-init-statement 条件 opt ; 表达式 opt ) 声明

     

相当于

     

{
  换初始化语句
  while ( 条件 ) {
  语句
  表达 ;
  }
  }

     

除了 for-init-statement 中声明的名称相同   声明性区域,如在条件中声明的那样,除了语句中的continue (未包含在另一个迭代语句中)   在重新评估条件之前执行表达式

即,在hole = child循环体之后才会执行for更新。

是的,在Stack Overflow降价中,这是一种痛苦的格式化。显然,标准的编辑也是如此(我认为这是用LaTeX编写的,或类似的东西),因为最后语句表达式条件缺少斜体。我在报价中补充说。

答案 3 :(得分:-3)

表单的任何for循环:

for (A; B; C) {
    ....
}

相当于表格的while循环:

{
    A;
    while (B) {
        ....
        C;
    };
}

所以,你可以看到循环的主体在'increment'部分之前执行(在这个例子中是C)。