PHP中的++$i和$i++有啥区别?
Posted
技术标签:
【中文标题】PHP中的++$i和$i++有啥区别?【英文标题】:What's the difference between ++$i and $i++ in PHP?PHP中的++$i和$i++有什么区别? 【发布时间】:2010-12-17 21:08:04 【问题描述】:php 中++$i
和$i++
有什么区别?
【问题讨论】:
【参考方案1】:++$i
是前置增量,而$i++
是后置增量。
i
,然后再取消引用。
后增量:取消引用然后递增i
"利用 PHP 的优势 允许您后增量 ($i++) 和预增量(++$i)。意义 是一样的,只要你不是 写任何像 $j = $i++, 但是预增量几乎是 10% 更快,这意味着你应该 从后增量切换到预增量 当你有机会时, 特别是在紧密的循环和 特别是如果你对 微优化!” - TuxRadar
为了进一步澄清,PHP 中的后增量已被记录为存储一个临时变量,该变量归因于这 10% 的开销与预增量。
【讨论】:
这是一般的经验法则,还是特定于 PHP 的。 ...来源在我的回答中列出。我自己还没有检查过...我想我可以通过查看 PHP 的源代码... 我自己不会泛化到其他语言。 预增量的速度提升是 PHP 特有的,因为后增量会创建一个临时变量,从而产生开销。 @knittl 请记住,这是(希望)非常快速操作的 10% :)【参考方案2】:++$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;
【讨论】:
这是更好的答案。没有代码示例的通用概括是没有意义的。对这些答案的支持可能来自那些已经知道它是如何工作的,因此认为它们是很好的答案。 我确信在较低级别还有更多内容,所以这个问题可能没有实际意义。但是为什么 PHP 需要 temp var?为什么不:$a=$i; $i=$i+1; @Taylor,这是个好问题!尝试用这样的函数调用替换 $i:$a=func()++
并问自己如何在没有 ++ 且不多次调用 func() 的情况下重写它。【参考方案3】:
++$i
是预增量
$i
递增
返回新值
$i++
是后增量
$i
的值复制到内部临时变量
$i
递增
返回 $i
旧值的内部副本
【讨论】:
【参考方案4】:++$i //first increment $i then run line
$i++ //first run line then increment $i
【讨论】:
这在技术上过于简单化了——想想 for 循环等等。【参考方案5】:在这种情况下没有区别:
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)
*/
【讨论】:
这很有用,前缀增量似乎最不意外。我现在要切换到始终使用前缀增量。【参考方案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
【讨论】:
感谢这个简单的例子。我现在明白了。【参考方案7】:不同之处是:++$i
将增加 $i
变量并返回更新值,而 $i++
将返回原始值,因此增加它。
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
【讨论】:
【参考方案8】:解释jldupont的观点:
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
【讨论】:
【参考方案9】:$i++ 称为后增量。只有先将 $i 的原始值赋给 $j 后,它才会增加 $i 的值。
++$i 被称为预增量。它在将值分配给 $j 之前增加 $i 的值,因此更新后的 $i 的值将分配给 $j。
因此,
$i = 4;
$j = $i++;
// Now, $i = 5 and $j = 4
$i = 4;
$j = ++$i;
// Now, $i = 5 and $j = 5
这些理论也以类似的方式适用于递减。
希望这会有所帮助!
【讨论】:
【参考方案10】:查看前后递增的另一种方式是,它是组合 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
【讨论】:
【参考方案11】:这可能是最好的例子……
后增量:
$zero = 0;
$n = $zero++; //$n is zero
预增量:
$zero = 0;
$n = ++$zero; //$n is one
【讨论】:
【参考方案12】:简答:
前缀增加值,返回增加值 后缀增加值并返回增加之前的值 前缀更快长答案:如果您稍微考虑一下,您将如何自己实现这些,您可能会意识到 why 前缀更快。说实话,后缀实际上(通常)是使用 前缀实现的:
const T T::operator ++ (int) // postfix
T orig(*this);
++(*this); // call prefix operator
return (orig);
避免使用后缀,除非您有特定的理由不这样做。对于复杂的数据类型,速度上的差异可能很大。
其实我几天前就查过了。 Heres my source.
【讨论】:
【参考方案13】:后置自增运算符的主要用途是这样的:
while(*condition*)
$array[$i++] = $something;
这是一种非常优雅的方式,如何绕过一些数组迭代。 细分:
-
变量 $something 将分配给以 $i 为索引的数组元素
变量 $i 将递增
迭代结束,将检查条件
在所有其他情况下,您应该使用前缀运算符。它使代码更加清晰(您可以肯定,您已经使用特定变量的增量值)。
【讨论】:
赞成使用前缀,除非严格需要后缀。【参考方案14】:我运行以下代码来测试 ++$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++';
【讨论】:
【参考方案15】:这两个运算符仍然按照其语法所暗示的那样做:递增。不管前缀还是后缀,变量肯定会加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++。
【讨论】:
以上是关于PHP中的++$i和$i++有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 中的事件循环和 Node.js 中的异步非阻塞 I/O 有啥区别?
PDOStatement::bindParam 中的 i,d,s,b 有啥区别