2011-05-20 17 views
15

說我有這樣的代碼:是按位還是保證評估順序?

unsigned int func1(); 
unsigned int func2(); 
unsigned int func3(); 

unsigned int x = func1() | func2() | func3(); 

不c + +保證FUNC1()將首先被調用,然後FUNC2(),然後FUNC3()?

或者是編譯器允許以任何順序調用函數的感覺?

另外,編譯器是否允許在這裏實現短路優化? (例如,如果func1()返回〜0,編譯器是否可以決定不打擾調用func2()或func3(),因爲它知道它們的返回值不會影響賦給x的值?)

+4

不屬於這個問題,而是一個現在被刪除的答案:三個沒有評論的downvotes?來吧,分享知識,不要傻。 @Answerer:你的答案的第一部分是不正確的,子表達式可以* any * order來評估;這可能就是你被低估的原因。 – GManNickG 2011-05-20 23:37:30

回答

17

不,不能保證函數被調用的順序。與||,|不同,它並不意味着順序點。

必須調用表達式中的所有函數,除非實現可以確定它們沒有副作用,並且它可以在不實際調用某個函數的情況下確定表達式的結果。該實現可以在「似乎」規則下執行此操作,該規則允許實現執行任何優化,這些優化不會被符合的程序觀察到或檢測到。

13

它會不是短路。它可能無序執行。 「

」評估方向不會影響包含多個乘法(*),加法(+)或二進制位運算符(& | ^)的表達式在同一級別上的結果。

+0

你在那裏報價? – ildjarn 2011-05-21 00:43:39

+1

http://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx – 2011-05-21 00:51:43

+4

這很公平;下次引用你的來源。 : - ] – ildjarn 2011-05-21 00:52:33