什么';这是++$i和$i++;在PHP中?

什么';这是++$i和$i++;在PHP中?,php,operators,Php,Operators,PHP中的++$i和$i++有什么区别?++$i是增量前的,而$i++是增量后的 预增量:先增量变量i,然后取消引用 增量后:取消引用,然后增量i “利用PHP 允许您发布增量($i++) 和前置增量(+++$i)。其含义 只要你不是,一切都一样 编写类似$j=$i++, 然而,预增量几乎为10% 更快,这意味着你应该 从后增量切换到预增量 当你有机会的时候, 尤其是在紧环和 尤其是如果你对这件事很迂腐的话 微观优化!” - 为了进一步澄清,PHP中的增量后存储被记录为存储一个临时变量,与增

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

++$i
是增量前的,而
$i++
是增量后的

  • 预增量:先增量变量
    i
    ,然后取消引用
  • 增量后:取消引用,然后增量
    i
“利用PHP 允许您发布增量($i++) 和前置增量(+++$i)。其含义 只要你不是,一切都一样 编写类似$j=$i++, 然而,预增量几乎为10% 更快,这意味着你应该 从后增量切换到预增量 当你有机会的时候, 尤其是在紧环和 尤其是如果你对这件事很迂腐的话 微观优化!” -


为了进一步澄清,PHP中的增量后存储被记录为存储一个临时变量,与增量前相比,该临时变量的开销为10%。

为了解释杜邦的观点:

++$i //first increment $i then run line
$i++ //first run line then increment $i 
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
区别在于:
++$i
将递增
$i
变量并返回更新后的值,而
$i++
将返回原始值,因此将其递增

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

这可能最好用一个例子来说明

增量后:

$zero = 0;
$n = $zero++; //$n is zero
$zero = 0;
$n = ++$zero; //$n is one
增量前:

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

+$i
是预增量

  • $i
    递增
  • 将返回新值
  • $i++
    是后期增量

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

  • +$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;
    

    简短回答:

    $zero = 0;
    $n = $zero++; //$n is zero
    
    $zero = 0;
    $n = ++$zero; //$n is one
    
    • 前缀增加值并返回增加的值
    • 后缀增加值并返回增加前的值
    • 前缀更快
    详细回答:如果您想一想,自己将如何实现这些功能,您可能会意识到为什么前缀更快。说实话,后缀实际上(通常)是使用前缀实现的:

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


    事实上我几天前查过这个

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

    预递增

    // 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
    
    后增量

    // 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
    

    在这种情况下,没有区别:

    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)
    */
    

    对于($i=0;$i我运行了以下代码来测试+++$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++';
    

    后修复增量运算符的主要用途如下:

    while(*condition*)
        $array[$i++] = $something;
    
    这是一个非常优雅的方法,如何绕过一些数组迭代。 细分:

  • 变量$something将分配给使用$i索引的数组元素
  • 变量$i将递增
  • 迭代结束时,将检查条件

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

    此示例非常简单


    这两个运算符仍按其语法含义执行:递增。无论前缀或后缀如何,变量都会递增1。两者之间的差异在于返回值。

    1。前缀increment返回变量递增后的值

    // 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
    
    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
    

    为了记住这条规则,我考虑了这两条规则的语法。当一个人键入前缀increment时,他会说++x。这里++的位置很重要。说++x意味着increment(++)首先返回x的值,因此我们有++x。后缀增量的作用相反。说x++意味着先返回x的值,然后再递增(++)它,因此x++。

    ++$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
    
    这些理论同样适用于递减


    希望这能有所帮助!

    这是一个一般的经验法则,还是特定于PHP的…源代码列在我的答案中。我自己还没有检查过它…我想我可以通过查看PHP的源代码…我自己不会推广到其他语言。预增量的速度增加是特定于PHP的,因为post-增量创建了一个临时变量,产生了开销。@knittl请记住,这是一个(希望是)非常快速的操作的10%:)从技术上讲,这是一个过于简单化的操作——想想for循环等。这很有用,前缀增量似乎没有什么意外。我现在将切换到始终使用前缀增量。投票赞成建议使用前缀,除非严格需要后缀。感谢简单的示例。我现在明白了。这是更好的答案。在没有代码示例的情况下对其进行一般性概括是毫无意义的。对这些答案的投票很可能来自