PHP中的++ $ i和$ i ++有什么区别?


Answers:


96

++$i是先递增,$i++后递增。

  • pre-increment:先增加变量i,然后取消引用。
  • 后递增:取消引用然后递增 i

“利用PHP允许您进行后递增($ i ++)和预递增(++ $ i)这一事实。只要您未编写类似$ j = $ i ++的内容,其含义是相同的。预增量几乎快了10%,这意味着您应该在有机会时从后增量切换到预增量,尤其是在紧密循环中,尤其是如果您对微优化感到惜!” - TuxRadar

为了进一步说明,PHP中的后增量已被记录为存储一个临时变量,该临时变量归因于与前增量相比这10%的开销。


6
这是一般的经验法则,还是特定于PHP?
Zoidberg,2009年

1
...来源在我的答案中列出。我自己还没有检查过……我想我可以通过查看PHP的源代码来实现……
jldupont

3
我本人不会一概而论。
jldupont

3
预增量的速度增加是特定于PHP的,这是因为后增量会创建一个临时变量,从而造成开销。
科里·巴卢

4
@knittl请记住,这是(一个希望)非常快速的操作的10%:)
jensgram

66

++$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;

3
这是更好的答案。如果没有代码示例,对此所做的一般概括是没有意义的。对此类答案的赞誉可能来自那些已经知道它如何工作的人,因此认为它们是不错的答案。
詹姆斯,

我敢肯定,在较低的层次上还有更多的东西,所以这个问题可能没有意义。但是,为什么PHP需要使用temp var?为什么不这样:$ a = $ i; $ i = $ i + 1;
泰勒·万斯

@Taylor,这是一个很好的问题!尝试用如下函数调用替换$ i:$a=func()++问自己,如何在不使用++且不多次调用func()的情况下重写它。
Shalom Craimer

43

++$i 是预增量

  1. $i 递增
  2. 返回新值

$i++ 是后增量

  1. 的值$i拷贝到内部临时变量
  2. $i 递增
  3. $i返回旧值的内部副本


11

在这种情况下没有区别:

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)
*/

这很有用,前缀增量似乎最少。我现在将切换为始终使用前缀增量。
CMCDragonkai 2015年

8

这个例子简单

<?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

感谢简单的例子。我现在知道了。
Praditha

7

区别在于:++$i将递增$i变量并返回更新的值,而$i++将返回原始值,因此将其递增。

$prefix = 1;
$postfix = 1;
echo ++$prefix;   // 2
echo $postfix++;  // 1

5

要解释jldupont的观点:

$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3

4

查看前后递增的另一种方法是组合两个语句的简写形式。

预递增

// 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

3

一个例子可能是最好的说明...

后增量:

$zero = 0;
$n = $zero++; //$n is zero

预增:

$zero = 0;
$n = ++$zero; //$n is one

3

简短答案:

  • 前缀增加值并返回增加的值
  • 后缀增加值并在增加之前返回值
  • 前缀更快

长答案:如果您考虑一下,如何自己实现这些,您可能会意识到为什么前缀更快。说实话,后缀实际上(通常)是使用前缀实现的:

const T T::operator ++ (int) // postfix
    {
    T orig(*this);
    ++(*this); // call prefix operator
    return (orig);
    }

除非有特殊原因,否则避免使用后缀。对于复杂的数据类型,速度上的差异可能很大。

我实际上是几天前查过的。这是我的消息来源。


3

固定后增量运算符的主要用途是这样的用法:

while(*condition*)
    $array[$i++] = $something;

这是一种非常优雅的方法,可以解决一些数组迭代问题。分解:

  1. 变量$ something将分配给以$ i索引的数组元素
  2. 变量$ i将增加
  3. 迭代结束,将检查条件

在所有其他情况下,应使用前缀运算符。它使代码更加清晰(可以确定的是,您已经在使用特定变量的增量值了)。


推荐使用前缀,除非严格需要后缀。
developerbmw

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

这些理论也以类似的方式适用于减量。

希望这可以帮助!


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++';

-1

两个运算符仍然按照其语法的含义进行操作:递增。无论前缀还是后缀,该变量都必须增加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 ++。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.