为什么for-loop不关心增量的方式?

时间:2012-08-02 21:05:14

标签: php for-loop increment

这可能是一个荒谬的问题"但我只是没有看到这种行为的原因。


事实:

$i++;

返回当前值,然后将$ i递增1。

++$i;

将$ i递增1,然后返回$ i。


情况:

for($i = 0; $i < 10; ++$i){
    echo $i."\n";
}

给出

0
1
2
3
4
5
6
7
8
9

第二

for($i = 0; $i < 10; $i++){
    echo $i."\n";   
}

也给出了

0
1
2
3
4
5
6
7
8
9

如果我按字面意思取得增量的文档,我会解释循环如下:

  1. 在每次迭代结束时,$ i增加1然后再增加 返回,所以我们首先得到0因为$ i从0开始,然后是1等。
  2. 在每次迭代结束时,返回$ i,然后递增, 这确实意味着有两个迭代,其中$ i = 0
  3. 事实并非如此。有人可以解释一下,为什么?

5 个答案:

答案 0 :(得分:6)

$i未被返回,正在使用(由您)。差异很大。

如果您要重写if语句而不是使用while循环,那么您将拥有以下内容:

<强>后递增

$i = 0;

while ( $i < 10 ) {
    echo $i."\n";
    $i++;
}

<强>预增量:

$i = 0;

while ( $i < 10 ) {
    echo $i."\n";
    ++$i;
}

如您所见,两者之间没有区别。


以下是您为for循环提供的3个语句的用语:

  1. 第一个步骤之前运行
  2. 每个步骤之前运行(使用返回的值来确定是否继续循环)
  3. 每一步后运行
  4. 在任何时候都不会以任何方式使用第三个语句的返回值。


    P.S。如上所述,第三个语句是在每个循环(包括最后一个)之后运行的。循环完成后访问$i变量就可以看出这一点:

    for ($i = 0; $i < 10; $i++) {
        echo $i."\n";
    }
    echo $i;
    

    会列出之前的所有数字,包括 10。

    在此处查看:[{3}}

答案 1 :(得分:2)

据我了解,for循环在执行第三个参数之前检查第二个参数中的条件。这意味着,在这两种情况下:

  • $i初始化为值0(显然,每次后续迭代都会跳过此步骤);
  • $i与10(它更小)进行比较;然后然后
  • $i会增加。

在最后一步中,在增量之前或之后返回$i的值是否无关紧要,因为$i的“返回”值实际上并未用于任何比较。在进行比较之后,存储在内存中的$i的实际值仍然每次迭代增加一次。

答案 2 :(得分:1)

for循环有3个组件:

  1. 初始化组件(第一个';'之前的代码)
  2. 终止条件(第一个';'和第二个';'之间的代码)
  3. 增量(在第二个';'之后)
  4. 这3段代码的执行顺序是:

    • (1)在for循环开始时执行一次

    • (2)在每次迭代之前验证

    • (3)在每次迭代之后执行

    因此,如果使用递增操作的前缀或后缀形式,则不重要;在每次迭代之后,将执行increment(3),您将获得递增变量的新值

    这:

    for($i = 0; $i < 10; $a = $i++){
        echo $i."\n";
    }
    

    与此相比

    for($i = 0; $i < 10; $a = ++$i){
        echo $i."\n";
    }
    

    会在每次迭代后对$ a的值产生影响,但不会在$ i的值中产生差异

答案 3 :(得分:0)

将变量后递增或预递增作为循环中的第三个表达式对其行为没有影响

因为$i++++$i都会在循环的每次迭代结束时执行。

答案 4 :(得分:0)

如果你把for循环写成if语句的序列,我认为为什么$ i每次递增会更有意义。

i = 0
if i > 10
    return
else
    print i
    i++ // or ++i
if i > 10
    return
else
    print i
    i++ // or ++i

等等。