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

时间:2009-11-18 13:37:19

标签: php operators

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

15 个答案:

答案 0 :(得分:80)

++$i$i++后增量时预先递增。

  • 预增量:首先增加变量i,然后取消引用。
  • post-increment:de-reference,然后递增i
  

“充分利用PHP的优势   允许你后增量($ i ++)   和预增量(++ $ i)。意思   只要你不是,就是一样的   写任何像$ j = $ i ++的东西,   然而预增量几乎是10%   更快,这意味着你应该   从后期切换到预增量   当你有机会的时候,   特别是在紧密的循环中   特别是如果你迂腐   微的优化!”    - TuxRadar

为了进一步说明,PHP中的后增量已经被记录为存储一个临时变量,该变量属于这个10%的开销而不是预增量。

答案 1 :(得分:43)

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

答案 2 :(得分:38)

++$i是预增量

  1. $i递增
  2. 返回新值
  3. $i++是后增量

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

答案 3 :(得分:12)

++$i //first increment $i then run line
$i++ //first run line then increment $i 

答案 4 :(得分:9)

在这种情况下没有区别:

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

答案 5 :(得分:6)

这个例子简直就是

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

?>

答案 6 :(得分:4)

差异是:++$i将增加$i变量并返回更新的值,而$i++将返回原始值,因此将其递增。

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

答案 7 :(得分:3)

解释jldupont的观点:

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

答案 8 :(得分:3)

查看前后递增的另一种方法是它是组合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

答案 9 :(得分:3)

修复后增量运算符的主要用途是这样的用法:

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

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

  1. 变量$ something将分配给使用$ i
  2. 索引的数组元素
  3. 变量$ i将递增
  4. 迭代结束,条件将被检查
  5. 在所有其他情况下,您应该使用前缀运算符。它使代码更加清晰(您可以肯定,您已经使用了特定变量的递增值)。

答案 10 :(得分:3)

$ i ++被称为后增量。仅在将$ i的原始值首先分配给$ j之后,它才会递增$ i的值。

++ $ i被称为预增量。它将$ i的值递增,然后再将其分配给$ j,因此将$ i的更新后的值分配给$ j。

因此

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

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

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

希望这会有所帮助!

答案 11 :(得分:1)

最好通过一个例子说明......

<强>后递增:

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

<强>预增量:

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

答案 12 :(得分:1)

简答:

  • 前缀增加值并返回增加的值
  • Postfix增加值并在增加之前返回值
  • 前缀更快

答案很长:如果你仔细考虑一下,如何自己实现这些,你可能会意识到为什么前缀更快。说实话,postfix实际上(经常)使用前缀实现

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

除非您有特殊原因,否则请避免使用postfix。对于复杂的数据类型,速度的差异可能非常大。

几天前我真的看了这个。 Heres my source.

答案 13 :(得分:0)

我运行以下代码来测试++ $ 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++';

答案 14 :(得分:0)

两个运算符仍然按照其语法含义:递增。不论前缀还是后缀,该变量都必须增加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 ++。