2013-01-02 76 views
8

在PHP手冊,operator precedence section的輸出,有這樣的例子:

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

我理解的行爲是由於以下原因未定義:

由於x + y = y + x口譯員可以自由評估xy添加任何順序,以優化速度和/或內存。我在看完C code example in this article後得出這個結論。

我的問題是,上述的PHP代碼的輸出應爲4不管表達和子表達式進行求值,其方式:

  • OP1 = ++ $ A => $ a = 2的,op1 = 2; op2 = $ a ++ => op2 = 2,$ a = 3; 2 + 2 = 4
  • op1 = $ a ++ => op1 = 1,$ a = 2; op2 = ++ $ a => op2 = 3,$ a = 3; 1 + 3 = 4

5從哪裏來?還是應該更多地瞭解運營商的工作方式?

編輯:

我在Incrementing/Decrementing Operators節一直盯着,但仍無法爲什麼5

++ $一個弄明白:預增 - 增加$一個接一個,那麼返回$ a。
$ a ++:後增值 - 返回$ a,然後將$ a加1。

+0

運行此代碼時,你真的得到5印嗎? – Ranty

+0

不,我總是得到4幾個版本的PHP。它是_may_這個詞,意思是我可以運行這個代碼一百萬次獲得reesult 4,但是沒有_guarantee_。 –

+0

@ H2CO3:我更感興趣知道_爲什麼5_。 –

回答

5
a = 1; 
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement) 
++ (postincrement) gives a = 3 (higher precedence than +) 
+ (add) gives 2 + 3 = 5 

$一個最初設置爲1,++ $一個然後preincrements $一式中使用它,將它設置爲2,並推動該值到詞法分析器堆棧之前。然後執行$ ++,因爲遞增器的優先級高於+,並且該值也將該結果推送到詞法分析器堆棧;然後發生的添加將詞法分析器堆棧的2結果添加到詞法分析器堆棧的3結果中,結果爲5,然後進行回顯。的$ a的值一旦已經執行的行是3。

OR

a = 1; 
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement) 
+ (add) gives 2 + 2 = 4 (the value that is echoed) 
++ (postincrement) gives a = 3 (incremented __after__ the variable is echoed) 

$一個最初設置爲1,當公式是解析中,++ $一個preincrements $ A,在公式中使用它之前將其設置爲2(將結果推送到詞法分析器堆棧)。然後將詞法分析器堆棧的結果和$ a的當前值相加,得到4;並且這個值被迴應。最後,$ a被postincremented,在$ a中留下值3。

+2

我編輯了我的問題。我也想到了這一點,但後來認識到後增量將返回當前值(即2),然後增加a。 –

1

是的,它會給你5,因爲右側運算符首先按優先級/優先級工作,之後運算總和(+)運算符。 所以第一個增量,使得它2和第二使它成爲3,之後雙方將總結和輸出你的結果爲5

$result = ++$a + $a++; 

++$a輸出爲2個

$a++輸出,只不過內部2 3它會增加。

終於總結會發生2 + 3 = 5

+2

「是的,它會給你5」 - 而是「是的,它也可能會給你5」。 – 2013-01-02 07:30:28

+0

即使在評估$ a ++之後$ a是3,表達式$ a ++仍然計算爲2,所以總和爲2 + 2。 – fgb

0

馬克,我相信你錯了!

後遞增:返回$ a,然後將$ a遞增1。 (來自文件)

因此,沒有辦法獲得總和操作中$ 3的值。

+0

問題是結果是不可預測的:OP詢問如何得到5的結果是可能的,而不是它是否給出了5 –

+0

的結果但是然後解釋:「++ $ a給出0和$ a ++給出5,所以0 + 5 = 5「會付出同樣的努力。我的意思是,兩者都反對文件。 – TomTom

相關問題