2015-11-14 47 views
-1

「if(systemReady == false)return」的區別是什麼?和「if(!systemReady)return」在CPU

if(systemReady == false)return;

and

if(!systemReady)return;

in cpu?

+0

我會以不同的方式標記,但我不確定標記的內容。 – Arc676

+0

大多數編程語言(如果objective-c是一個例外,我會感到驚訝)是根據抽象語義定義的。也就是說,規範說明了應該發生什麼,現在應該怎麼發生。很可能有幾種有效的方法來編譯這兩個代碼片段(特別是當您考慮多個不同的體系結構時),所以無法分辨cpu級別的差異。如果我被迫猜測,我會說生成的機器碼相當於這兩者。 – aioobe

回答

0

爲什麼不用調試器檢查它?好的,沒有理由這樣做。而且,說實話,沒有什麼理由來回答你的問題:然而,...

表達!expr將編譯到這樣的事情:(取決於CPU)

Load expr 
Complement 
Branch if zero 

表達expr==false會編譯頂部是這樣的:

Load expr 
(Compare with #0) 
Branch if (not) zero 

如果在執行時間差,編譯器會自動選擇了一個更快的,如果你設置的優化級別的東西比沒有優化高。

所以根本就不在乎這個。選擇這個選項,你認爲閱讀更好。

+0

非常感謝! –

1

對於任何中途正常的編譯器,這些語句將編譯爲等效的機器代碼。即使他們不這樣做,但這種差異會非常微小,以至於你必須瘋狂才能照顧。不要過早地優化。此外,算法的選擇幾乎總是將實施細節放大幾個數量級來確定性能。

最後,你永遠不應該與之比較的truefalseYESNO等因爲有這不等於true真值這是危險的。任何非零值都是正確的。

這也是不好的風格。 systemReady(顯然)已經是一個布爾值。沒有必要將它與任何東西進行比較,以使其成爲布爾值。

問問你自己,你會不會寫:

if ((systemReady == false) == true) return; 

或者:

if (((systemReady == false) == true) == true) return; 

如果不是,那麼你應該明白爲什麼寫if (systemReady == false) ...也是錯誤的。同樣無故添加冗餘比較。

因此,使用你的第二種形式:if (!systemReady) ...

+0

'expr == true'是多餘的(對於布爾型expr),'expo == false'不是多餘的,因爲'!expr'不是多餘的。而且,與布爾值比較沒有什麼問題,因爲整數比較整型文本沒有什麼問題。 –

+0

非常感謝! –

相關問題