在阅读循环分析的文本时,我遇到了以下线性搜索例程,以返回数组中的最大值:
template <class otype>
int location_of_max (const otype a[], int first, int last)
{
int max_loc = first;
for (++first; first <= last; ++first) {
if (a[first] > a[max_loc]) {
max_loc = first;
}
}
return max_loc;
}
在相同的循环条件下有两个增量++first
有点令人困惑。是否有一个原因?
答案 0 :(得分:6)
代码比较每个循环上的两个元素。
初始循环声明语句将“start”迭代器推进到第二个数组位置,因为“reference”元素(a[max_loc]
)作为第一个元素开始生命。
这避免了一个不必要的和毫无意义的比较(即a[max_loc] > a[max_loc]
)。
答案 1 :(得分:2)
看看它在做什么。
for循环的格式是(init; condition; increment)。
此时无需检查[first]&gt; a [max_loc]因为first == max_loc,所以作为init的一部分首先预先递增到下一个索引。此步骤仅执行一次。第二个增量发生在循环的每次迭代中。
答案 2 :(得分:-3)
for 语句中的第一个子句只是一个起始值,在块执行之前只执行一次。
第三个子句在每个块迭代结束时执行,并且在条件 - 第二个子句 - 被评估之前执行。