回答
不,沒有這樣的保證。根據C++標準它是未定義的。
Bjarne的Stroustrup的也表示明確地在「The C++程序設計語言」第3版第6.2.2節,具有一定的推理:
更好的代碼可以在 沒有限制的情況下產生對錶達 評價順序
雖然技術上這指的是相同的部分,其說,表達的零件的評估順序也是未定義的早期部分,即
int x = f(2) + g(3); // udefined whether f() or g() is called first
bar()和baz()沒有指定的順序 - 標準說的唯一的事情就是它們都將在foo()被調用之前被評估。根據C++標準,5.2.2/8節:
參數 的評估順序未指定。
至少在foo()之前對它們進行評估的事實有點讓人放心。 – 2017-04-25 13:58:01
從[5.2.2]功能呼叫,
的參數評價的順序是不確定的。參數表達式評估的所有副作用在輸入函數之前生效。
因此,不能保證bar()
將baz()
之前運行,只有bar()
和baz()
將foo
之前被調用。
另外,從[5]表達式注意:
除非另有說明[例如特殊規則
&&
和||
],個別操作符和個別表達式的子表達式的操作數的評估順序,以及發生副作用的順序是未指定的。
所以即使你在問是否bar()
將在foo(bar() + baz())
baz()
之前運行,訂單仍然是不確定的。
[5.14]邏輯AND運算符中的「特別提示」示例:「不像'&','&&'保證從左至右的評估:如果第一個操作數爲」false「,則不評估第二個操作數。 – 2010-05-29 12:31:10
在C++ 11,相關的文本可以在8.3.6 Default arguments/9(重點煤礦)中找到每一個函數被調用時
默認參數進行評估。 函數參數的求值順序未指定。因此,函數的參數不應該用在默認參數中,即使它們沒有被評估。
C++ 14標準也使用了相同的措辭,並在the same section下找到。
C++ 17指定直到C++ 17爲止未指定的運算符的評估順序。請參閱問題What are the evaluation order guarantees introduced by C++17?但請注意您的表達
foo(bar(), baz())
仍未指定評估順序。
正如其他人已經指出的那樣,該標準沒有給出關於這個特定場景評估順序的任何指導。評估順序留給編譯器,編譯器可能有保證。
請務必記住,C++標準實際上是一種指示編譯器構造彙編/機器代碼的語言。該標準只是等式的一部分。如果標準不明確或者具體定義了實現,則應該轉向編譯器並瞭解它如何將C++指令轉換爲真正的機器語言。因此,如果評估的順序是一個需求,或者至少是重要的,並且交叉編譯器兼容並不是必需的,那麼請調查編譯器如何最終將它們組合在一起,您的答案可能最終會落在那裏。請注意,編譯器可能會改變它的方法在未來
- 1. C評價秩序
- 2. C++參數評價順序
- 3. 秩序的功能應用
- 4. 功能評價超時
- 5. 功能評價禁用的,因爲以前的功能評價超時
- 6. 秩序的IList與參數
- 7. C++ 17評價順序與運算符重載功能
- 8. C/C++宏評價順序
- 9. 移動語義&參數評價順序
- 10. 更新與價值功能似乎只評價函數一次
- 11. JavaScript是否具有功能參數評估的定義順序?
- 12. 評價或製作功能javascript
- 13. Obj-C功能參數
- 14. C++酒吧功能參數
- 15. C:信號功能(參數?)
- 16. C#通功能參數
- 17. 評價在C++
- 18. 評價在C#
- 19. ASP Filter功能 - > C#等價函數
- 20. R中未評價的參數
- 21. 密集秩價格
- 22. 秩序的NSArray - 目標C
- 23. JavaScript性能評價
- 24. 迭代器在置換價值秩序
- 25. 「太多的參數功能」用C
- 26. 功能C++的參數太少
- 27. 功能錯誤的參數太少? (C++)
- 28. 出錯的C#語法功能參數
- 29. C++代碼的功能參數
- 30. C#中VB6的ObjPtr的等價(功能)?
我可以在8分鐘內接受這個答案... 我想我堅持了一下! – 2010-05-29 12:02:39
是的,但如果表達式評估順序爲STRICT,那麼更好的代碼可以是WRITTEN(=更清晰),這通常比代碼生成更重要。看到這個例子:http://stackoverflow.com/questions/43612592/the-case-where-c-ab-is-not-equal-to-c-ab-b-b1?noredirect=1#comment74274141_43612592 所以那裏,Stroustrup。 – 2017-04-25 13:57:06
如果訂購很重要,您可以自由地進行排序。否則總是會導致花費一些並不總是(很少?)重要的事情。我認爲不支付你不使用的政策是大多數C++程序員認同的唯一方法。 – tweej 2017-12-02 09:53:54