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

When is pre-decrement applied in a for loop?

本文关键字:应用 for 循环 何时      更新时间:2023-10-16

我正在尝试实现一个使用某种C风格伪代码指定的算法。

该算法的大部分是for循环:

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

据称,循环运行十次

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

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

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

| 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作为初始值,仍然存在困惑。

我尝试复制我看到的逻辑(执行次数比文档中少一次),但我的结果仍然不匹配。不幸的是,我无法访问任何函数代码来将我的结果与已知的良好实现进行比较。所以我可能找错树了。

我是不是找错树了?

for条件的第三部分在迭代后执行

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

for循环执行"初始化、测试、正文、增量、测试、主体、增量、检测、主体等"。在第一次测试之前不应用增量。

顺便说一句,如果你想从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]}`);
}