OK,我有點不好意思問這個問題,但我只是想確保...短路評價和副作用
據瞭解,C使用短路評價布爾表達式:
int c = 0;
if (c && func(c)) { /* whatever... */ }
在這個例子func(c)
不叫,因爲c
計算結果爲0
。但是更復雜的例子比較的副作用會改變接下來要比較的變量嗎?就像這樣:
int c; /* this is not even initialized... */
if (canInitWithSomeValue(&c) && c == SOMETHING) { /*...*/ }
功能canInitWithSomeValue
返回true和變化值在成功的情況下給出的指針。是否保證後續比較(本例中的c == SOMETHING
)使用canInitWithSomeValue(&c)
設置的值?
無論編譯器使用多麼繁重的優化?
我想你可能會混淆短路評估和編譯器優化。在第一個例子中,編譯器會優化整個if語句,因爲它永遠不會運行。短路評估意味着如果你在運行時有if(func1()&& func2()){...}'和func1()評估爲false **(即編譯時沒有定義),那麼代碼不應該檢查'func2()' - 編譯器應該製作機器代碼,以便如果'func1()'爲false,則不調用'func2()'。 – Stephen 2010-09-03 12:35:51
在比較的時候,'int c = 0'表明'c'等於'0',我意識到在簡單的情況下編譯器會優化整個'if'。 – 2010-09-03 12:53:32
啊,我很抱歉。我誤解了你。我很抱歉。 – Stephen 2010-09-03 13:46:23