++$i
和$i++
PHP和有什么不一样?
Answers:
++$i
是先递增,$i++
后递增。
i
,然后取消引用。i
“利用PHP允许您进行后递增($ i ++)和预递增(++ $ i)这一事实。只要您未编写类似$ j = $ i ++的内容,其含义是相同的。预增量几乎快了10%,这意味着您应该在有机会时从后增量切换到预增量,尤其是在紧密循环中,尤其是如果您对微优化感到惜!” - TuxRadar
为了进一步说明,PHP中的后增量已被记录为存储一个临时变量,该临时变量归因于与前增量相比这10%的开销。
++$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;
$a=func()++
问自己,如何在不使用++且不多次调用func()的情况下重写它。
在这种情况下没有区别:
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)
*/
这个例子简单
<?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
一个例子可能是最好的说明...
后增量:
$zero = 0;
$n = $zero++; //$n is zero
预增:
$zero = 0;
$n = ++$zero; //$n is one
固定后增量运算符的主要用途是这样的用法:
while(*condition*)
$array[$i++] = $something;
这是一种非常优雅的方法,可以解决一些数组迭代问题。分解:
在所有其他情况下,应使用前缀运算符。它使代码更加清晰(可以确定的是,您已经在使用特定变量的增量值了)。
$ 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
这些理论也以类似的方式适用于减量。
希望这可以帮助!
我运行以下代码来测试++ $ 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++';
两个运算符仍然按照其语法的含义进行操作:递增。无论前缀还是后缀,该变量都必须增加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 ++。