2010-05-29 65 views

回答

83

不,沒有這樣的保證。根據C++標準它是未定義的。

Bjarne的Stroustrup的也表示明確地在「The C++程序設計語言」第3版第6.2.2節,具有一定的推理:

更好的代碼可以在 沒有限制的情況下產生對錶達 評價順序

雖然技術上這指的是相同的部分,其說,表達的零件的評估順序也是未定義的早期部分,即

int x = f(2) + g(3); // udefined whether f() or g() is called first 
+0

我可以在8分鐘內接受這個答案... 我想我堅持了一下! – 2010-05-29 12:02:39

+0

是的,但如果表達式評估順序爲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

+1

如果訂購很重要,您可以自由地進行排序。否則總是會導致花費一些並不總是(很少?)重要的事情。我認爲不支付你不使用的政策是大多數C++程序員認同的唯一方法。 – tweej 2017-12-02 09:53:54

18

bar()和baz()沒有指定的順序 - 標準說的唯一的事情就是它們都將在foo()被調用之前被評估。根據C++標準,5.2.2/8節:

參數 的評估順序未指定。

+2

至少在foo()之前對它們進行評估的事實有點讓人放心。 – 2017-04-25 13:58:01

13

從[5.2.2]功能呼叫,

的參數評價的順序是不確定的。參數表達式評估的所有副作用在輸入函數之前生效。

因此,不能保證bar()baz()之前運行,只有bar()baz()foo之前被調用。

另外,從[5]表達式注意:

除非另有說明[例如特殊規則&&||],個別操作符和個別表達式的子表達式的操作數的評估順序,以及發生副作用的順序是未指定的。

所以即使你在問是否bar()將在foo(bar() + baz())baz()之前運行,訂單仍然是不確定的。

+3

[5.14]邏輯AND運算符中的「特別提示」示例:「不像'&','&&'保證從左至右的評估:如果第一個操作數爲」false「,則不評估第二個操作數。 – 2010-05-29 12:31:10

2

在C++ 11,相關的文本可以在8.3.6 Default arguments/9(重點煤礦)中找到每一個函數被調用時

默認參數進行評估。 函數參數的求值順序未指定。因此,函數的參數不應該用在默認參數中,即使它們沒有被評估。

C++ 14標準也使用了相同的措辭,並在the same section下找到。

0

正如其他人已經指出的那樣,該標準沒有給出關於這個特定場景評估順序的任何指導。評估順序留給編譯器,編譯器可能有保證。

請務必記住,C++標準實際上是一種指示編譯器構造彙編/機器代碼的語言。該標準只是等式的一部分。如果標準不明確或者具體定義了實現,則應該轉向編譯器並瞭解它如何將C++指令轉換爲真正的機器語言。因此,如果評估的順序是一個需求,或者至少是重要的,並且交叉編譯器兼容並不是必需的,那麼請調查編譯器如何最終將它們組合在一起,您的答案可能最終會落在那裏。請注意,編譯器可能會改變它的方法在未來