我正在阅读我的数据结构书,看到一些与我不相符的代码。我认为我对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循环中的所有内容都在第一次迭代之前或第一次迭代时运行。
答案 0 :(得分:3)
for循环的最后一部分仅在循环完成第一次迭代后执行。因此,它首先设置孩子,然后给孩子分配洞。
答案 1 :(得分:3)
在执行循环体之后执行hole = child
赋值,因此在执行循环时,child
已被赋值。
首先,循环等同于:
int child;
while (hole * 2 <= currentSize)
{
child = hole * 2;
hole = child;
}
(这是第一次近似,因为break
和continue
的行为无法通过显示的音译进行捕捉 - 但您的代码无论如何都没有。)
您只需使用child
作为循环体即可避免hole *= 2;
。
答案 2 :(得分:2)
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
)。