2009-11-18 105 views
58

PHP中的++$i$i++有什麼區別?

回答

69

++$i是預增量,而$i++後增量。

  • 預增量:首先增量變量i然後解除引用。
  • 後增量:去參考,然後遞增i

「拿的事實,即PHP 允許您張貼增量($ I ++) 和預增(++ $優勢i)。意思 是一樣的,只要你不是 寫什麼都像$ j = $ i ++, 然而預先遞增幾乎是10% 更快,這意味着你應該 從post-當你有機會時,增加 , 特別是在緊密的循環中,尤其是如果你對於微觀優化的 迂腐! - TuxRadar

對於進一步澄清,-遞增後在PHP已被記錄爲存儲哪些屬性此10%的開銷相對於預增量的臨時變量。

+0

我在你的報價來源很感興趣。 10%對我來說似乎很重要 – knittl 2009-11-18 13:41:22

+6

這是一個一般的經驗法則,還是PHP的具體規定。 – Zoidberg 2009-11-18 13:42:40

+0

...源在我的答案中列出。我沒有檢查過自己...我想我可以通過查看PHP的源代碼,但... – jldupont 2009-11-18 13:43:07

9
++$i //first increment $i then run line 
$i++ //first run line then increment $i 
+0

這在技術上是過於簡單化 - 想到for循環等。 – 2009-11-18 13:50:12

3

爲了解釋jldupont的觀點:

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

差異是:++$i將增加$i變量並返回更新後的值,而$i++將返回原來的價值,所以加一。

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

它可能是最好的例子說明...

後遞增:

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

預增量:

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

++$i是預增量

  1. $i遞增
  2. 的新值被返回

$i++是-遞增後

  1. $i拷貝到內部臨時變量
  2. $i遞增
  3. 舊的內部拷貝的值返回$i的值
25

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

簡短的回答:

  • 前綴增加值,並返回值增加
  • Postfix增加該值,並在增加值之前返回該值
  • 前綴更快

龍答:如果你想想看一點點,你會如何實現這些你自己,你可能會意識到爲什麼前綴更快。

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

避免後綴,除非你有特殊原因不能到:使用前綴真相被告知,後綴實際上是(常)實施。對於複雜的數據類型,速度差異可能相當大。

我實際上在幾天前看了這個。Heres my source.

3

查看前後遞增的另一種方法是它是組合2個語句的簡寫。

預遞增遞增後

// long form 
$x = $y; // any statement using $y 
$y = $y + 1; 

// shorthand 
$x = $y++; // the same statement using $y 
9
在這種情況下

// long form 
$y = $y + 1; 
$x = $y; // any statement using $y 

// shorthand 
$x = ++$y; // the same statement using $y 

是沒有區別的:

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

這很有用,前綴增量似乎沒有什麼意外。我現在要切換到始終使用前綴增量。 – CMCDragonkai 2015-06-26 13:24:47

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

定位後增量運算符的主要目的是,像這樣的:

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

這是一個非常優雅的方式,如何讓周圍的一些陣列的迭代。 擊穿:

  1. 變量$東西將被分配到與$ I
  2. 索引的數組元素
  3. 變量$我將遞增
  4. 迭代是在端部,條件將被檢查

在所有其他情況下,您應該使用前綴運算符。它使代碼更加清晰(您可以確定,您已經使用了特定變量的遞增值)。

+0

Upvoted推薦使用前綴,除非後綴是嚴格需要的。 – developerbmw 2016-05-14 20:36:00

2

這個例子elplains只是

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

?> 
+0

感謝這個簡單的例子。我現在知道了。 – Praditha 2018-01-12 07:06:04

相關問題