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

在PHP中, ++$i$i++什么区别?

++$i是预先增量,而$i++后增量。

  • 预增量:首先增量variablesi ,然后解除参考。
  • 后增量:解引用,然后增加i

“利用PHP允许你后递增($ i ++)和前递增(++ $ i)这一事实,只要你不写$ j = $ i ++之类的东西,其含义是相同的。预先递增的速度几乎快了10%,这意味着当你有机会的时候,你应该从后期转换到预先递增,特别是在紧密的循环中,特别是如果你对微观优化的学习迂腐的话。 – TuxRadar

为了进一步说明,PHP中的后增量已经被logging为存储一个临时variables,该variables属于这个10%开销与预增量之间的关系。

++$i是预增量

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

$i++是后增量

  1. $i的值复制到一个内部临时variables中
  2. $i递增
  3. 返回$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; 
 ++$i //first increment $i then run line $i++ //first run line then increment $i 

在这种情况下是没有区别的:

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

区别在于: ++$i将增加$ivariables并返回更新的值,而$i++将返回原始值,所以增加它。

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

为了解释jldupont的观点:

 $i = 1; $x = $i++; echo $x; // prints 1 $x = ++$i; echo $x; // prints 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 

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

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

这是一个非常优雅的方式,如何解决一些数组迭代。 分解:

  1. variables$ something将被赋值给用$ i索引的数组元素
  2. variables$ i将被递增
  3. 迭代到最后, 条件将被检查

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

这可能是最好的例子。

后递增:

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

预增:

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

简短的回答:

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

长的回答:如果你想一点,你将如何实现自己,你可能会意识到为什么前缀更快。 真相被告知,postfix实际上(通常) 使用前缀实现:

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

避免后缀,除非你有一个特定的原因不。 速度的差异对于复杂的数据types可能相当多。

其实我前几天看了这个。 inheritance人我的来源。

我运行下面的代码来testing++ $ i是否比$ i ++快10%。 我承认,守则没有一个稳定的结果,但即使如此,我应该至less看到一些数字接近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++'; 

这个例子很简单

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