在PHP中,++ $ i和$ i ++有什么区别?
在PHP中, ++$i
和$i++
什么区别?
++$i
是预先增量,而$i++
后增量。
- 预增量:首先增量variables
i
,然后解除参考。 - 后增量:解引用,然后增加
i
“利用PHP允许你后递增($ i ++)和前递增(++ $ i)这一事实,只要你不写$ j = $ i ++之类的东西,其含义是相同的。预先递增的速度几乎快了10%,这意味着当你有机会的时候,你应该从后期转换到预先递增,特别是在紧密的循环中,特别是如果你对微观优化的学习迂腐的话。 – TuxRadar
为了进一步说明,PHP中的后增量已经被logging为存储一个临时variables,该variables属于这个10%开销与预增量之间的关系。
++$i
是预增量
-
$i
递增 - 新的值被返回
$i++
是后增量
-
$i
的值复制到一个内部临时variables中 -
$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;
++$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
将增加$i
variables并返回更新的值,而$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;
这是一个非常优雅的方式,如何解决一些数组迭代。 分解:
- variables$ something将被赋值给用$ i索引的数组元素
- variables$ i将被递增
- 迭代到最后, 条件将被检查
在所有其他情况下,您应该使用前缀运算符。 它使得代码更加清晰(可以肯定的是,你已经使用了特定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 ?>