PHP中的++$i
和$i++
有什麼區別?
回答
++$i
是預增量,而$i++
後增量。
- 預增量:首先增量變量
i
然後解除引用。 - 後增量:去參考,然後遞增
i
「拿的事實,即PHP 允許您張貼增量($ I ++) 和預增(++ $優勢i)。意思 是一樣的,只要你不是 寫什麼都像$ j = $ i ++, 然而預先遞增幾乎是10% 更快,這意味着你應該 從post-當你有機會時,增加 , 特別是在緊密的循環中,尤其是如果你對於微觀優化的 迂腐! - TuxRadar
對於進一步澄清,-遞增後在PHP已被記錄爲存儲哪些屬性此10%的開銷相對於預增量的臨時變量。
++$i //first increment $i then run line
$i++ //first run line then increment $i
這在技術上是過於簡單化 - 想到for循環等。 – 2009-11-18 13:50:12
爲了解釋jldupont的觀點:
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
差異是:++$i
將增加$i
變量並返回更新後的值,而$i++
將返回原來的價值,所以加一。
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
它可能是最好的例子說明...
後遞增:
$zero = 0;
$n = $zero++; //$n is zero
預增量:
$zero = 0;
$n = ++$zero; //$n is one
++$i
是預增量
$i
遞增- 的新值被返回
$i++
是-遞增後
- 的
$i
拷貝到內部臨時變量 $i
遞增- 舊的內部拷貝的值返回
$i
的值
++$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;
簡短的回答:
- 前綴增加值,並返回值增加
- Postfix增加該值,並在增加值之前返回該值
- 前綴更快
龍答:如果你想想看一點點,你會如何實現這些你自己,你可能會意識到爲什麼前綴更快。
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
避免後綴,除非你有特殊原因不能到:使用前綴真相被告知,後綴實際上是(常)實施。對於複雜的數據類型,速度差異可能相當大。
我實際上在幾天前看了這個。Heres my source.
查看前後遞增的另一種方法是它是組合2個語句的簡寫。
預遞增遞增後
// long form
$x = $y; // any statement using $y
$y = $y + 1;
// shorthand
$x = $y++; // the same statement using $y
// 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)
*/
這很有用,前綴增量似乎沒有什麼意外。我現在要切換到始終使用前綴增量。 – CMCDragonkai 2015-06-26 13:24:47
我運行下面的代碼來測試++ $ 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++';
定位後增量運算符的主要目的是,像這樣的:
while(*condition*)
$array[$i++] = $something;
這是一個非常優雅的方式,如何讓周圍的一些陣列的迭代。 擊穿:
- 變量$東西將被分配到與$ I 索引的數組元素
- 變量$我將遞增
- 迭代是在端部,條件將被檢查
在所有其他情況下,您應該使用前綴運算符。它使代碼更加清晰(您可以確定,您已經使用了特定變量的遞增值)。
Upvoted推薦使用前綴,除非後綴是嚴格需要的。 – developerbmw 2016-05-14 20:36:00
這個例子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
?>
感謝這個簡單的例子。我現在知道了。 – Praditha 2018-01-12 07:06:04
- 1. i ++和++ i有什麼區別?
- 2. --i和i--有什麼區別?
- 3. phpinfo();有什麼區別?和php -i?
- 4. 爲什麼在for循環中「++ i」和「i ++」有什麼區別?
- 5. i = i + j有什麼區別;和i + = j;在C語言?
- 6. makefile中-I和-L有什麼區別?
- 7. ++ i和i ++在JavaScript中有什麼區別
- 8. C中i--和i-1有什麼區別?
- 9. ruby中/ \ p {Alpha}/i和/ \ p {L}/i有什麼區別?
- 10. 與%i和%li有什麼區別?
- 11. printf(「%d」,i ++)和i ++之間有什麼區別;的printf( 「%d」,i)的?
- 12. ++ i和i + 1在javascript中的區別是什麼
- 13. for循環(Java)中的i ++&++ i有什麼區別?
- 14. i == 0和0 == i有區別嗎?
- 15. * x = i和x =&i之間的區別是什麼
- 16. while(++ i < - j)&while(i ++ <j--)有什麼區別?
- 17. virtio,emulated-IO,direct I/O,I/O passthrough,SR-IOV有什麼區別?
- 18. *(matrix1 + i)和* matrix1 [i]之間的區別?
- 19. Javascript:Forloop i ++和(i + 1)之間的區別
- 20. C中的%i,%d和%D有什麼區別? (printf)
- 21. JSP中的<%和<%i有什麼區別?
- 22. R中的x^2和I(x^2)有什麼區別?
- 23. 時鐘和I/O中斷有什麼區別?
- 24. USB標準中語法I(0,1)和I(1,0)之間的區別是什麼?
- 25. 就原子性而言,i ++和i = i + 1之間的區別
- 26. 在這個循環中,++ i和i ++有區別嗎?
- 27. 工作線程和I/O線程有什麼區別?
- 28. QueryParser和API之間有什麼區別?
- 29. DMA控制器和I/O處理器有什麼區別
- 30. `sed -i -e`和`sed -ie`有什麼區別?
我在你的報價來源很感興趣。 10%對我來說似乎很重要 – knittl 2009-11-18 13:41:22
這是一個一般的經驗法則,還是PHP的具體規定。 – Zoidberg 2009-11-18 13:42:40
...源在我的答案中列出。我沒有檢查過自己...我想我可以通過查看PHP的源代碼,但... – jldupont 2009-11-18 13:43:07