【问题标题】:What's the difference between ++$i and $i++ in PHP?PHP中的++$i和$i++有什么区别?
【发布时间】:2010-12-17 21:08:04
【问题描述】:

PHP 中++$i$i++ 有什么区别?

【问题讨论】:

    标签: php operators


    【解决方案1】:

    ++$i 是前置增量,而$i++ 是后置增量。

    • 预增量:先增加变量i,然后再取消引用。
    • 后增量:取消引用然后递增i

    "利用 PHP 的优势 允许您后增量 ($i++) 和预增量(++$i)。意义 是一样的,只要你不是 写任何像 $j = $i++, 但是预增量几乎是 10% 更快,这意味着你应该 从后增量切换到预增量 当你有机会时, 特别是在紧密的循环和 特别是如果你对 微优化!” - TuxRadar

    为了进一步澄清,PHP 中的后增量已被记录为存储一个临时变量,该变量归因于这 10% 的开销与预增量。

    【讨论】:

    • 这是一般的经验法则,还是特定于 PHP 的。
    • ...来源在我的回答中列出。我自己还没有检查过...我想我可以通过查看 PHP 的源代码...
    • 我自己不会泛化到其他语言。
    • 预增量的速度提升是 PHP 特有的,因为后增量会创建一个临时变量,从而产生开销。
    • @knittl 请记住,这是(希望)非常快速操作的 10% :)
    【解决方案2】:
    ++$i //first increment $i then run line
    $i++ //first run line then increment $i 
    

    【讨论】:

    • 这在技术上过于简单化了——想想 for 循环等等。
    【解决方案3】:

    解释jldupont的观点:

    $i = 1;
    $x = $i++;
    echo $x; // prints 1
    $x = ++$i;
    echo $x; // prints 3
    

    【讨论】:

      【解决方案4】:

      不同之处是:++$i 将增加 $i 变量并返回更新值,而 $i++ 将返回原始值,因此增加它。

      $prefix = 1;
      $postfix = 1;
      echo ++$prefix;   // 2
      echo $postfix++;  // 1
      

      【讨论】:

        【解决方案5】:

        最好用一个例子来说明......

        后增量:

        $zero = 0;
        $n = $zero++; //$n is zero
        

        预增量:

        $zero = 0;
        $n = ++$zero; //$n is one
        

        【讨论】:

          【解决方案6】:

          ++$i 是预增量

          1. $i 递增
          2. 返回新值

          $i++ 是后增量

          1. $i 的值复制到内部临时变量
          2. $i 递增
          3. 返回 $i 旧值的内部副本

          【讨论】:

            【解决方案7】:

            ++$i 递增 $i,但计算结果为 $i+1 的值 $i++ 递增 $i,但计算结果为 $i 的旧值。

            这是一个例子:

            $i = 10;
            $a = $i++;
            // Now $a is 10, and $i is 11
            
            $i = 10;
            $a = ++$i;
            // Now $a is 11, and $i is 11
            

            使用$i++ 有时会产生轻微的性能成本。看,当你做类似的事情时

            $a = $i++;
            

            你真的在这样做:

            $temporary_variable = $i;
            $i=$i+1;
            $a=$temporary_variable;
            

            【讨论】:

            • 这是更好的答案。没有代码示例的通用概括是没有意义的。对这些答案的支持可能来自那些已经知道它是如何工作的,因此认为它们是很好的答案。
            • 我确信在较低级别还有更多内容,所以这个问题可能没有实际意义。但是为什么 PHP 需要 temp var?为什么不:$a=$i; $i=$i+1;
            • @Taylor,这是个好问题!尝试用这样的函数调用替换 $i:$a=func()++ 并问自己如何在没有 ++ 且不多次调用 func() 的情况下重写它。
            【解决方案8】:

            简答:

            • 前缀增加值,返回增加值
            • 后缀增加值并返回增加之前的值
            • 前缀更快

            长答案:如果您稍微考虑一下,您将如何自己实现这些,您可能会意识到 why 前缀更快。说实话,后缀实际上(通常)是使用 前缀实现的:

            const T T::operator ++ (int) // postfix
                {
                T orig(*this);
                ++(*this); // call prefix operator
                return (orig);
                }
            

            避免使用后缀,除非您有特定的理由不这样做。对于复杂的数据类型,速度上的差异可能很大。

            其实我几天前就查过了。 Heres my source.

            【讨论】:

              【解决方案9】:

              查看前后递增的另一种方法是,它是组合 2 个语句的简写。

              预增

              // long form
              $y = $y + 1;
              $x = $y; // any statement using $y
              
              // shorthand
              $x = ++$y; // the same statement using $y
              

              后递增

              // long form
              $x = $y; // any statement using $y
              $y = $y + 1;
              
              // shorthand
              $x = $y++; // the same statement using $y
              

              【讨论】:

                【解决方案10】:

                在这种情况下没有区别:

                for($i = 0;$i<3;++$i)var_dump $i;
                /*
                int(0)
                int(1)
                int(2)
                */
                for($i = 0;$i<3;$i++)var_dump $i;
                /*
                int(0)
                int(1)
                int(2)
                */
                

                但是:

                for($i = 0;$i<3; $j = ++$i )var_dump($j);
                /*
                NULL
                int(1)
                int(2)
                */
                for($i = 0;$i<3; $j = $i++ )var_dump($j);
                /*
                NULL
                int(0)
                int(1)
                */
                

                【讨论】:

                • 这很有用,前缀增量似乎最不意外。我现在要切换到始终使用前缀增量。
                【解决方案11】:

                我运行以下代码来测试 ++$i 是否比 $i++ 快 10%。我承认,代码没有稳定的结果,但即便如此,我至少应该看到一些接近 10% 的数字。我得到的最高值约为 4-4.5%。

                <?php
                
                $randomFloat = rand(0, 10) / 10;
                
                $before1 = microtime(true);
                
                for($i=0; $i <1000000; ++$i){
                    $rand = (rand(0, 10) / 10) * (rand(0, 10) / 10);
                }
                
                $after1 = microtime(true);
                echo 'it took '.($after1-$before1) . ' seconds fot ++$i<br />';
                
                $before2 = microtime(true);
                
                for($i=0; $i <1000000; $i++){
                    $rand = (rand(0, 10) / 10) * (rand(0, 10) / 10);
                }
                
                $after2 = microtime(true);
                echo 'it took '.($after2-$before2) . ' seconds fot $i++<br /><br />';
                
                echo '++$i is '.((($after1-$before1)*100)/($after2-$before2)-100).'% faster than $i++';
                

                【讨论】:

                  【解决方案12】:

                  后置自增运算符的主要用途是这样的:

                  while(*condition*)
                      $array[$i++] = $something;
                  

                  这是一种非常优雅的方式,如何绕过一些数组迭代。 细分:

                  1. 变量 $something 将分配给以 $i 为索引的数组元素
                  2. 变量 $i 将递增
                  3. 迭代结束,将检查条件

                  在所有其他情况下,您应该使用前缀运算符。它使代码更加清晰(您可以肯定,您已经使用特定变量的增量值)。

                  【讨论】:

                  • 赞成使用前缀,除非严格需要后缀。
                  【解决方案13】:

                  这个例子很简单

                  <?php 
                  
                  $x = 10;  
                  
                  echo $x++. ' '.$x;  // the result is 10 and 11
                  
                  echo '<br>';
                  
                  $y = 10;
                  
                  echo ++$y. ' ' .$y; // the result is 11 and 11
                  
                  // so the  $x++ is not showing +1 at first but the next time
                  // and the ++y is showing +1 first time but not increasing next
                  

                  【讨论】:

                  • 感谢这个简单的例子。我现在明白了。
                  【解决方案14】:

                  这两个运算符仍然按照其语法所暗示的那样做:递增。不管前缀还是后缀,变量肯定会加1。两者的区别在于返回值。

                  1. 前缀增量返回变量自增后的值。

                  2.另一方面,更常用的后缀增量返回变量在增量之前的值。

                  // Prefix increment
                  
                  let prefix = 1;
                  console.log(++prefix); // 2
                  
                  console.log(prefix); // 2
                  
                  // Postfix increment
                  
                  let postfix = 1;
                  
                  console.log(postfix++); // 1
                  
                  console.log(postfix); // 2
                  

                  为了记住这条规则,我想到了两者的语法。当一种类型的前缀增加时,一种说 ++x。 ++ 的位置在这里很重要。说 ++x 意味着先增加 (++) 然后返回 x 的值,因此我们有 ++x。后缀增量则相反。说 x++ 意味着先返回 x 的值,然后递增 (++) 它,因此 x++。

                  【讨论】:

                    【解决方案15】:

                    $i++ 称为后增量。只有先将 $i 的原始值赋给 $j 后,它才会增加 $i 的值。

                    ++$i 被称为预增量。它在将值分配给 $j 之前增加 $i 的值,因此更新后的 $i 的值将分配给 $j。

                    因此,

                    $i = 4;
                    $j = $i++;
                    // Now, $i = 5 and $j = 4
                    
                    $i = 4;
                    $j = ++$i;
                    // Now, $i = 5 and $j = 5
                    

                    这些理论也以类似的方式适用于递减。

                    希望这会有所帮助!

                    【讨论】:

                      猜你喜欢
                      • 2011-03-21
                      • 2021-08-25
                      • 2021-12-30
                      相关资源
                      最近更新 更多