2012-10-25 127 views
2

可能重複:
prefix/suffix increment運算符優先級的PHP

operator precedence官方PHP手冊中有如下奇怪的代碼和註釋吧:

// mixing ++ and + produces undefined behavior 
$a = 1; 
echo ++$a + $a++; // may print 4 or 5 

燦有人解釋我爲什麼說在某些情況下可能會打印4或5? 對我來說,很明顯,它會首先增加$ a(值爲2),然後總結$ a和$ a(4),然後纔會將$ a值更改爲3.所以,結果應該是4.

+0

請不要寫這樣的代碼 - 它是不清楚和不可讀的。如果你沿着這條大道走下去,你將來會遇到各種各樣的問題,編寫代碼。 –

+0

@Ed Heal爲了公平對待他,那不是他的代碼。它是從PHP手冊複製並粘貼的。 – Kenzo

+0

@Kenzo - 這就是爲什麼我使用評論功能。 –

回答

1

更新。這是而不是給出了一個完整的答案。我無法清楚地顯示你將如何得到5.

我在下面寫的是基於C++的真實情況,它可能有助於優先級不控制執行語句部分的順序,以及一個語句的效果不會自動(至少不能保證)更新語句中的變量。

例如:

a=1 
b=a++ ; // b is 1, a is 2 
c=++a ; // c is 3, a is 3 

現在想想寫C + B。這將評估爲1 + 3 = 4。但是當你寫出

a++ + ++a 

從語言中不能保證a會在每個單獨的增量後被更新。

所以,你可能也得到

a=1 
b=a++ ; // b is 1, a is 2 
a=1 ; 
c=++a ; // c is 2, a is 2 

在3

產生的效果這其實沒有什麼用的優先級,甚至評估順序。 例如,如果變量保證在語句中更新,翻轉評估順序,無論如何,您都會得到4。

a=1 
c=++a ; // c is 2, a is 2 
b=a++ ; // b is 2, a is 3 
+0

還不清楚 –

+0

我會進一步澄清。 –

+0

從你的解釋中我瞭解到$(a ++)中$ a的更新並不意味着在($ a ++)中$ a的值仍然等於1.我說得對嗎? –