0

这可能是一个可笑的“问题”,但我只是不明白这种行为的原因。


事实:

$i++;

返回当前值,然后将 $i 加一。

++$i;

将 $i 加一,然后返回 $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 加一然后返回,所以我们首先得到一个 0,因为 $i 从 0 开始,然后是 1,依此类推。
  2. 在每次迭代结束时,返回 $i 然后递增,这意味着有两次迭代 $i = 0。


事实并非如此。有人可以解释一下,为什么?

4

5 回答 5

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. 跑完一步

绝不会以任何方式使用第三条语句的返回值。


PS如前所述,第三条语句在每个循环之后运行,包括最后一个$i通过在循环完成后访问变量可以明显看出这一点:

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

这将列出所有不超过 10 的数字

在此处查看实际操作:http: //viper-7.com/Y6N2jU

于 2012-08-02T21:09:14.137 回答
2

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

  • $i用值 0 初始化(这一步显然会在每次后续迭代中跳过);
  • $i与 10 相比(它更小);然后_
  • $i递增。

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

于 2012-08-02T21:10:38.517 回答
1

一个 for 循环有 3 个组件:

  1. 一个初始化组件(第一个';'之前的代码)
  2. 终止条件(第一个';'和第二个';'之间的代码)
  3. 一个增量(在第二个 ';' 之后)

这3段代码的执行顺序是:

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

  • (2)每次迭代前验证

  • (3)每次迭代后执行

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

这:

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

与此相比

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

每次迭代后都会改变 $a 的值,但不会改变 $i 的值

于 2012-08-02T21:15:20.840 回答
0

将变量作为循环中的第三个表达式进行后递增或预递增不会对其行为产生影响

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

于 2012-08-02T21:10:16.083 回答
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

等等。

于 2012-08-02T21:11:39.110 回答