【问题标题】:why does the for-loop not care about the way of increment?为什么for循环不关心增量方式?
【发布时间】:2012-08-02 21:05:14
【问题描述】:

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


事实:

$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.


事实并非如此。谁能解释一下,为什么?

【问题讨论】:

  • 动作总是在循环结束时发生。无论您是后增量还是预增量,都可以在最后将其视为一个完全独立的语句。
  • 非常感谢您的回答,事实证明我真的很困惑设置语句和返回某些东西之间的区别。这应该也是 $i+2 而不是 $i=$i+2 在这部分循环中不起作用的原因。

标签: php for-loop increment


【解决方案1】:

$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. 每一步之后运行

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


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

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

这将列出并包括 10 的所有数字。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我认为你的回答有点复杂。对于循环: 1. 初始化 2. 比较,运行 3. 增量。因此,无论您是发布还是预增量,它都会在循环代码运行之后和下一次比较之前发生。
    • @Rawr 是的,可能。但我能说什么呢?我只是一个复杂的人。
    • 我最喜欢你的回答,因为它实际上列出了 for 循环阶段。但后来我读了最后一段,我很喜欢?
    【解决方案3】:

    一个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 的值

    【讨论】:

      【解决方案4】:

      如果你将 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
      

      等等。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 他知道,他在问“为什么?
        猜你喜欢
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 2016-08-10
        相关资源
        最近更新 更多