何时在for循环中应用预减量?

时间:2015-03-30 02:57:41

标签: c++ algorithm for-loop

我正在尝试实施an algorithm that is specified using some C style pseudocode

算法的大部分是for循环:

for (i = 20;i > 0;i -= 2) 
{
    //...snip
}

声称循环十次次:

  

整个系列的修改是一系列10个相同的双轮。

我已将算法移植到我自己的语言中,我的结果与测试向量不匹配。因此,我试图挑选出C语言的细节,以便弄清楚我可能做错了什么。

也许我的代码与测试向量的结果不匹配的原因是它应该只运行 9 次:

| i  | i -= 2 | i > 0 | Perform iteration |
|----|--------|-------|-------------------|
| 20 | 18     | Yes   | Yes - 1           |
| 18 | 16     | Yes   | Yes - 2           |
| 16 | 14     | Yes   | Yes - 3           |
| 14 | 12     | Yes   | Yes - 4           |
| 12 | 10     | Yes   | Yes - 5           |
| 10 |  8     | Yes   | Yes - 6           |
|  8 |  6     | Yes   | Yes - 7           |
|  6 |  4     | Yes   | Yes - 8           |
|  4 |  2     | Yes   | Yes - 9           |
|  2 |  0     |  No   | No                |  

如果我在逻辑上阅读if语句,它只会被执行九次。

为什么他们说它运行十次轮次仍然存在混淆,但是然后使用 20 作为初始值。

我尝试复制我看到的逻辑(执行次数少于记录的次数),但我的结果仍然不匹配。不幸的是,我无法访问任何功能代码来将我的结果与已知良好的实现进行比较。所以我可能会咆哮错误的树。

我吵了一棵错误的树吗?

3 个答案:

答案 0 :(得分:2)

for循环进行"初始化,测试,身体,增量,测试,身体,增量,测试,身体等。"在第一次测试之前不会应用增量。

答案 1 :(得分:2)

{/ 1}}条件的第三部分在迭代后执行

循环运行10次,for为20,18,16,14,12,10,8,6,4,2为每次迭代的主体。

答案 2 :(得分:0)

顺便说一句,如果你想在 for 循环中从最后一个元素到第一个元素,但又不想要丑陋的:

for (let i = arr.length - 1; i >= 0; i--)

您可以使用:

for (let i = arr.length; i-- > 0;)

示例:

const arr = ['a', 'b', 'c'];

for (let i = arr.length; i-- > 0;) {
  console.log(`arr[${i}] is: ${arr[i]}`);
}

如果您在这里使用了预递减,最后一次迭代(数组的第一个元素)就会丢失:

const arr = ['a', 'b', 'c'];

for (let i = arr.length; --i > 0;) {
  console.log(`arr[${i}] is: ${arr[i]}`);
}