1

我在这里遇到了一些代码https://stackoverflow.com/a/2922778/2176900是这样开始的:

for (i = 0, j = nvert-1; i < nvert; j = i++) {...`

我不明白当括号中有四个东西(“i = 0”,“j = nvert-1”,“i < nvert”和“j = i++”)时它会做什么。我显然一直在尝试用谷歌搜索,但似乎找不到任何答案。我敢肯定,如果我知道括号中的东西叫什么,我会很高兴的。

谢谢

4

3 回答 3

8

它没有四样东西;它仍然有三个。

  • 预循环语句
    i = 0, j = nvert-1

  • 迭代条件
    i < nvert

  • 迭代后动作
    j = i++

该循环前语句实际上可能应该是:
var i = 0, j = nvert-1

请记住,我们可以在一个声明中声明多个变量。这就是这里发生的事情。

于 2013-06-19T23:36:19.540 回答
4

为了补充来自@LightnessRacesinOrbit 和@basilikum 的出色答案,以下是我在查看for这样的不寻常循环时发现的有用提示:将其分解为更原始的形式。

任何for循环:

for( initialize; condition; advance ) {
    // loop body here
}

可以转换为等效while循环:

initialize;
while( condition ) {
    // loop body here
    advance;
}

所以你发现的循环:

for ( i = 0, j = nvert-1;  i < nvert;  j = i++ ) {
    // loop body here
}

可以写成:

i = 0,  j = nvert - 1;
while( i < nvert ) {
    // loop body here
    j = i++;
}

现在我们可以把它分解成更简单的步骤。

正如@basilikum 所说,第一行:

i = 0,  j = nvert - 1;

是相同的:

i = 0;
j = nvert - 1;

和循环的最后一行:

    j = i++;

是相同的:

    j = i;
    i = i + 1;

因此,将它们放回我们最终得到的代码中:

i = 0;
j = nvert - 1;
while( i < nvert ) {
    // loop body here
    j = i;
    i = i + 1;
}

这比原始for循环更冗长,但如果原始循环令人困惑,可能更容易考虑。

于 2013-06-20T00:15:31.520 回答
1

除了语法,用户 Lightness Races in Orbit 已经解释过,有这样一个循环的原因很可能是循环一个数组并总是访问两个相邻的项目。

var list = [1,2,3,4],
    nvert = list.length;

for (i = 0, j = nvert-1; i < nvert; j = i++) {
    //...
}

第一次迭代:

i = 0; //index of first item
j = nvert-1; //indext of last item

以下迭代:

j = i;     //j becomes the old value of i
i = i + 1; //i gets incremented by one

因此,如果您考虑数组,[1,2,3,4]那么每次迭代将代表以下项目:ij

//first iteration
i => 1
j => 4

//second iteration
i => 2
j => 1

//third iteration
i => 3
j => 2

//fourth iteration
i => 4
j => 3
于 2013-06-19T23:54:22.980 回答