PHP中++$i
和$i++
之间有什么区别?
答案 0 :(得分:80)
++$i
在$i++
后增量时预先递增。
i
,然后取消引用。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
是预增量
$i
递增 $i++
是后增量
$i
的值$i
递增$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;
这是一种非常优雅的方式,如何绕过一些数组迭代。 击穿:
在所有其他情况下,您应该使用前缀运算符。它使代码更加清晰(您可以肯定,您已经使用了特定变量的递增值)。
答案 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实际上(经常)使用前缀实现:
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 ++。