2012-02-18 57 views
2

我遇到了增量運算符的一個奇怪問題。下面的代碼應該輸出什麼?

$j = 0; 
for ($i=0; $i<100; $i++) 
{ 
    $j = $j++; 
} 
echo $j; 

它回聲0爲什麼不是100?


編輯:當我改變$j = $j++$j = ++$j到,它呼應100

+2

您正在使用後綴增量,它會在增量前分配變量的值。所以'$ j' = 0每次。 '++ $ j'會在賦值之前進行遞增。當然,你可以完全跳過作業,並自己做'$ j ++'... – Interrobang 2012-02-18 02:46:16

+0

這將是一個很好的面試問題。 – Umbrella 2012-02-18 02:51:30

+0

@傘:這可能是一個很好的電話屏幕問題,以幫助您決定是否值得邀請候選人在現場。 – 2012-02-18 17:43:00

回答

7

你正在做一個「後增量」,因爲++出現在它正在修改的變量之後。該代碼,在更短的緊湊的形式寫出來,可以歸結爲:

for ($i = 0; $i < 100; $i++) { 
    $temp = $j; // store j 
    $j = $j + 1; // $j++ 
    $j = $temp; // pull original j out of storage 
} 

如果你有++$j,則j將首先增加,產生的增加值將被分配回J.然而,這樣的結構使很少有意義。你可以簡單地寫出來

for (...) { 
    $j++; 
} 

其歸結爲

for (...) { 
    $j = $j + 1; 
} 
+0

感謝Marc B,你解決了我的困惑,$ j ++先存儲了值,所以它變成了0最後。當使用++ $ j時,它首先添加值! – steve 2012-02-18 02:55:28

6

的問題是與線

$j = $j++; 

該命令評估$j爲0,然後遞增$j爲1,最後把0賦值回$j

可以使用$j = $j + 1;或者只是$j++;

+1

或者只是做$ j = ++ $ j;' – 2012-02-18 02:46:16

+3

@AaronW。這會起作用,但這是多餘的和混亂的。我的團隊永遠不會允許它通過代碼審查。 – 2012-02-18 02:47:40

3

$j++是後遞增:表達式的值是$j,然後$j遞增。所以你得到j的值,然後遞增j,然後將j設置爲j的原始值。