當$a = 1
會是怎樣表達的輸出echo ($a + $a++ + $a++)
-6
A
回答
3
這可能會更好用更短的例子來說明:
$a = 1;
echo $a + $a++;
這可能看起來像它應該等於2的遞增運算符($a++
)返回變量的值,「之前」,所以應該返回1和1 + 1等於2
然而,實際發生的是$a++
正在接受評估。所以後增量運算符運行,並返回1,但在其餘的評估發生時,$a
已增加到2.因此,這最終評估2 + 1
;
你舉的例子歸結爲:
- 運行第一
$a++
,返回1 $ A現在是2; - 評估總和
2 + 1
(新$a
值和從INCR後操作者的返回),返回3 - 運行第二
$a++
(線的端部),增量之前返回2(的$a
值)。 $ a現在是3; - 評估第二總和,
3 + 2
,返回5
總之,請不要寫這樣的代碼行。如果你想知道PHP如何在內部工作,他們是一個有趣的實驗,但它們不是直觀的。
修改添加: @納爾夫的下面評論也很重要。這是未定義的行爲,不應該依賴。事實上,答案確實在PHP < 5.1中有所不同。見https://3v4l.org/sqCkW
3
爲operators precedence手冊明確表明以此爲未定義行爲的一個例子:
運算符優先級和結合僅確定表達式的分組方式,他們不指定評估的順序。 PHP不會(通常情況下)指定評估表達式的順序,並且應避免假定特定評估順序的代碼,因爲PHP的各個版本之間的行爲可能會發生變化,或者取決於周圍的代碼。
實例#評價2未定義順序
<?php $a = 1; echo $a + $a++; // may print either 2 or 3
相關問題
- 1. 怎樣的一個結構
- 2. phpMyAdmin - 下一個配置會怎樣?
- 3. 我怎樣才能輸出這個函數是一個簡單的字符串?
- 4. 你怎樣稱呼一個返回與輸入相同輸出的函數?
- 5. 如何與一個輸出
- 6. JavaScript輸出「1」 - - 「1」是2怎麼樣?
- 7. 怎樣一個R中
- 8. 我怎樣才能變出一個班?
- 9. 怎樣才能與JavaScript一個字母
- 10. 怎能n = 1時是一個函數
- 11. 一次輸出一個循環而不是一次輸出一個循環?
- 12. 當「a」是一個int數組時,爲什麼「a + 1」和「&a + 1」會給出不同的結果?
- 13. 輸出是另一個
- 14. 一個怎樣創造Ember.js
- 15. 怎樣一個過程
- 16. 怎樣判斷一個數是素JS
- 17. 一個輸出
- 18. 一個無輸出
- 19. 我怎樣才能把地圖輸出成一個單一的集合
- 20. 只輸出一個.cocoapods依賴項目中的一個.a靜態庫
- 21. Rmarkdown輸出到Word會創建一個表,而不是兩個
- 22. 如果一個cassandra節點出現故障會怎麼樣
- 23. 我怎樣才能讓mysql輸出一個DateTime到Julian天數?
- 24. 我怎樣才能把一個python腳本的輸出作爲另一個python腳本的用戶輸入
- 25. MySQL輸出一個低於另一個
- 26. 怎樣才能實現一個堆,每個節點是一個類?
- 27. 我怎樣才能比較一個字符串與幾個值?
- 28. 我怎樣才能把一個單一的值與fputcsv
- 29. 你怎麼能得到一個像輸出一樣的Linux頂端使用C
- 30. 我怎樣纔能有一個彈出窗口來自一個選項卡而不是一個視圖
橡膠鴨它,你會弄明白 –
從C(其中PHP在某種程度上是)衍生大多數語言會說這是*未定義行爲*。這完全取決於操作如何排序。 –
這就是實際發生的情況:https://3v4l.org/sqCkW/vld#output – iainn