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++有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

for循环中的i++和++i有啥区别? [复制]

makefile 中的 -I 和 -L 有啥区别?

JavaScript 中的事件循环和 Node.js 中的异步非阻塞 I/O 有啥区别?

PDOStatement::bindParam 中的 i,d,s,b 有啥区别

linux发行版中的i386/i686/x86-64/有啥区别?

sudo -i和sudo -s有啥区别