如您所知,C/C++沒有指定表達式評估順序。什麼原因讓他們不明確。爲什麼C/C++沒有定義表達式評估順序?
1
A
回答
4
它允許編譯器優化。 一個例子是算術指令對ALU的最大使用率進行重新排序,或者通過計算隱藏內存延遲。
1
C/C++設計目標之一是編譯器的高效實現。因此,編譯器可以相對自由地選擇複雜表達式中各種子表達式的評估順序;我們認爲這個順序不受運算符優先級和關聯性的限制。在這種情況下,當我們在多個子表達式中修改相同的可變參數時,行爲變得不被滿足。在放棄之前的值之後並且在表達式的任何其他部分被疏散之前,不保證遞增或遞減操作立即執行。唯一的保證是更新將在表達式考慮完成之前執行。
未定義的行爲意味着未定義,任何事情都可能發生。
來源:C程序設計師Steve Summit的常見問題
相關問題
- 1. 表達式評估順序
- 2. 摺疊表達式的評估順序
- 3. 以什麼順序評估布爾表達式
- 4. django中的urls.py正則表達式評估順序是什麼?
- 5. Python中條件表達式的評估順序是什麼?
- 6. 爲什麼這個表達式按照這個順序進行評估?
- 7. 角JS表達式沒有評估
- 8. 打印表達式沒有評估它
- 9. 表達式評估序列
- 10. C++表達式評估。 「評估」是什麼意思?
- 11. 如何確定數學表達式的評估順序?
- 12. 是否有TreeVisitor以評估順序訪問表達式樹?
- 13. 評估表達式
- 14. Ruby用正則表達式評估表達式,沒有eval
- 15. F#評估的順序是什麼?
- 16. 按照什麼順序評估MySQL JOIN?
- 17. 爲什麼預增量沒有評估
- 18. 爲什麼Excel的「評估」方法是一般表達式評估器?
- 19. 爲什麼這個表達式評估爲false?
- 20. 爲什麼這個JavaScript表達式評估爲false?
- 21. 爲什麼表達式(0 == 0&1 == 1)評估爲False?
- 22. 爲什麼以下表達式被評估爲true?
- 23. 爲什麼這個表達式繼續評估爲0
- 24. 爲什麼這兩個表達式評估爲不同的值?
- 25. 爲什麼這個表達式在JavaScript中被評估爲「a」?
- 26. 評估這個的順序是什麼?爲什麼? C++
- 27. 評估順序
- 28. 評估表達式爲Excel公式
- 29. 爲什麼「評估lambda表達式在調試器中無效」?
- 30. AngularJS /材料:爲什麼不評估表達式?
我期待着一些很好的答案。就像,對於從左到右(或其他)評估順序,編譯器可以從某些語句(例如函數調用或其他語句)生成優化的(A)彙編代碼(x86)塊,並且對於未定義的評估順序,編譯器可以生成優化的B)彙編代碼(x86)塊。在(A)和(B)之間進行一些比較也是很好的(比如爲什麼(B)更快)。 此外,這個決定有多好?許多優化技術通常不會實現(包括特定於平臺的技術) – 2009-08-01 19:31:36