【问题标题】:Two versions of decrement operator in PHPPHP中减量运算符的两个版本
【发布时间】:2015-09-28 14:31:23
【问题描述】:

在检查 PHP 页面时,我注意到以下代码:

for ($n=10; $n>0; --$n) {
    //foo;
}

为什么要把递减运算符放在变量之前?

【问题讨论】:

标签: php decrement


【解决方案1】:

--$x$x-- 是不同的运算符。它们都将变量减 1,但它们返回不同的东西。

  • --$x:这会减少 $x 并返回其 值:

    $y = --$x;
    // Is equivalent to
    // $x = $x-1;
    // $y = $x;
    
  • $x--:这会减少 $x 并返回其原始值:

    $y = $x--;
    // Is equivalent to
    // $y = $x;
    // $x = $x - 1;
    

for 中,循环它不应该有什么不同。该值仍在递减中。

【讨论】:

    【解决方案2】:

    PHP 支持 C 风格的 pre- 和 post-increment 和 decrement 运算符。

    注意:递增/递减运算符只影响数字和字符串。数组、对象和资源不受影响。递减 NULL 值也没有影响,但递增它们会导致 1。

    ++$a    Pre-increment   Increments $a by one, then returns $a.
    $a++    Post-increment  Returns $a, then increments $a by one.
    --$a    Pre-decrement   Decrements $a by one, then returns $a.
    $a--    Post-decrement  Returns $a, then decrements $a by one.
    

    一个例子:

    <?php
    echo "<h3>Postincrement</h3>";
    $a = 5;
    echo "Should be 5: " . $a++ . "<br />\n";
    echo "Should be 6: " . $a . "<br />\n";
    
    echo "<h3>Preincrement</h3>";
    $a = 5;
    echo "Should be 6: " . ++$a . "<br />\n";
    echo "Should be 6: " . $a . "<br />\n";
    
    echo "<h3>Postdecrement</h3>";
    $a = 5;
    echo "Should be 5: " . $a-- . "<br />\n";
    echo "Should be 4: " . $a . "<br />\n";
    
    echo "<h3>Predecrement</h3>";
    $a = 5;
    echo "Should be 4: " . --$a . "<br />\n";
    echo "Should be 4: " . $a . "<br />\n";
    ?>
    

    PHP Manual: Incrementing/Decrementing Operators

    编辑:

    for ($n=10; $n>0; --$n) {
       echo "Iterating:" . $n . "<br>";
    }
    

    输出:

    Iterating:10
    Iterating:9
    Iterating:8
    Iterating:7
    Iterating:6
    Iterating:5
    Iterating:4
    Iterating:3
    Iterating:2
    Iterating:1
    

    在您的示例中,第一次迭代将具有 $n = 10,因为 --$n 部分在 for 循环结束时执行。

    【讨论】:

      【解决方案3】:

      它们略有不同......这是一个性能问题;尝试类似

      <?php 
      for($i=0;$i<100000000;++$i){
          //heating up the cpu (if it uses some power saving feature or whatever)
      }
      $i=0;
      $PreIncrementStart=microtime(true);
      for($i=0;$i<100000000;++$i){
          //counting to 100 million, using pre-increment.
      }
      $PreIncrementEnd=microtime(true);
      $i=0;
      $PostIncrementStart=microtime(true);
      for($i=0;$i<100000000;$i++){
          //counting to 100 million, using post-increment.
      }
      $PostIncrementEnd=microtime(true);
      $PreTime=$PreIncrementEnd-$PreIncrementStart;
      $PostTime=$PostIncrementEnd-$PostIncrementStart;
      if($PreTime<$PostTime){
          echo "the fastest was pre-increment. (which totally makes sense, it's consistent with c/c++, and it uses fewer opcodes than the post-increment, and the `old` value is not returned, only the new value, so we don't need 2 values (old value AND new value, as the post-increment does)..)";
      } else {
          echo "the fastest was post-increment... i am very surprised.";
      }
      echo "the difference was: ".abs($PreTime-$PostTime)." seconds.";
      

      【讨论】:

        猜你喜欢
        • 2021-01-25
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多