可能重複評價:
order of evaluation of function parametersC/C++的參數在函數調用
它是安全的使用C/C以下施工++?
f(g(), h());
g()
其中預計要被評估第一,然後h()
。
所有編譯器在所有架構上都顯示相同的行爲嗎?
可能重複評價:
order of evaluation of function parametersC/C++的參數在函數調用
它是安全的使用C/C以下施工++?
f(g(), h());
g()
其中預計要被評估第一,然後h()
。
所有編譯器在所有架構上都顯示相同的行爲嗎?
不!不能保證執行這些命令的順序。只有g()和h()在f()之前執行。 看到這個:http://www.gotw.ca/gotw/056.htm 我想有一個更新的C++ 11版本,我會看看。
編輯:C++ 11版本http://herbsutter.com/gotw/_102/
編輯2:如果你真的想知道具體的編譯器做的,試試這個:http://www.agner.org/optimize/calling_conventions.pdf 第7章(第16頁)可能是相關的,雖然這是一個有點過我的頭,但例如__cdecl調用約定意味着參數從右向左傳遞(至少以這種方式存儲),而對於__fastcall「前兩個DWORD或更小的參數在ECX和EDX寄存器中傳遞;所有其他參數傳遞給右向左。」 (http://msdn.microsoft.com/en-us/library/6xa169sk%28v=vs.71%29.aspx)
因此它對於不同的編譯器會有所不同。
很久以後編輯:事實證明,使用初始化列表語法(大括號{}
)構造函數,評價的順序爲保證(即使它是一個構造函數的調用,這並不需要一個std::initializer_list
。See this question。
沒有,評價參數相對於彼此的順序是不確定的。你有唯一的保證是,他們不會彼此同時執行。
[在這情況下保證從何而來?](http://stackoverflow.com/questions/13443532/could-ac-implementation-in-theory-parallelise-the-evaluation-of-two-functio) – 2012-11-18 19:11:02
否。標準在這種情況下並沒有定義評估順序,每個編譯器都可以做任何想做的事情。 我認爲他們中的大多數人(特別是gcc
)首先評估最重要的。
根據優化標誌(和目標硬件)。 – 2012-02-02 17:56:43
見1.9程序執行:
其它某些方面和抽象機的操作在本國際標準被描述爲 未指定(例如,訂單的參數評估的給函數)。在可能的情況下,國際標準定義了一組允許的行爲。
和8.3.6默認參數,9:
[...]默認參數是每個函數被調用時進行評價。功能 參數的評估順序未指定。因此,函數的參數不應用於默認參數 ,即使它們未被評估。 [...]
不,這不安全 - 如果您需要保證的評估順序,例如由於副作用,那麼你需要做這樣的事情:
foo = g();
bar = h();
f(foo, bar);
這個問題是問經常在這裏,我不能決定選擇了一個重複的標誌... – PlasmaHH 2012-02-02 16:37:53
THX,但什麼哪一個關於真實世界的編譯器?他們使用什麼順序? – psihodelia 2012-02-02 16:40:25
@psihodelia:我已經看到要使用的每個訂單。 – PlasmaHH 2012-02-02 16:41:15