2013-12-18 22 views
0

哪個更好使用& &或||?例如,如果我需要檢查,如果輸入的是5和27整除之間3,是能夠更好地檢查作爲使用「AND」或「OR」的效率

if((num < 5) || (num > 27) || (num%3 != 0)) 
{ 
//skip 
} 
else 
{ 
//operations 
} 

OR

if((num >= 5) && (num <= 27) && (num%3 == 0) 
{ 
//operations 
} 
+4

不知道爲什麼你關心'''和'&&'當你有一個'%'的時候。 – yamafontes

+1

沒有性能差異。選擇更適合你的選項。 –

+0

與您的具體問題無關,但這兩者並不相同。一個檢查5-27,而另一個檢查獨佔。 – Dusty

回答

0

除非你是在一個非常緊密的循環這樣做,你永遠不會注意到任何不同。

大多數C編譯器都會重寫表達式以利用短路評估,所以對於這些編譯器來說,順序是不相關的(對於C++ there are exceptions)。

如果你的編譯器不能優化布爾運算(在現代編譯器中不太可能),第二種形式更好,因爲它允許跳過一些術語。

+0

「第二種形式更好,因爲它允許跳過一些術語。」您的意思是與第一種形式相對嗎? '1 ||有什麼影響printf(「執行\ n」)'? –

+0

@PascalCuoq:如果這兩個表單沒有被編譯爲相同的代碼,那麼編譯器沒有進行優化。如果不是最優化,||的每個項將被評估。你的'1 || printf(「execution \ n」)'不一樣,因爲'printf()'可能有副作用(的確如此)。短路評估僅針對原始類型(根據規格)完成,因爲已知它們沒有副作用。 –

0

從CPU的角度來看,和& &將更有可能不完全相同的時間完成。從編譯器的角度來看,兩者之間的轉換將是一項微不足道的操作 - 這無疑是您正確選擇的一種選擇。使用最清楚的給你。

要充分利用C的短路來確保分支儘可能少的執行指令來確定,這對你來說更爲重要。

+0

如果我使用||,C的短路是否會更有效?這樣||會是更好的選擇嗎?考慮到我的意圖是檢查它是否在範圍內?我錯過了什麼嗎? – Kevin

+0

@Kevin你錯過了簡單的解決方案,即將兩個版本都編譯爲程序集,並且啓用了基本的優化功能並觀察它們 - 即使它們還沒有將其轉換爲另一個,它們基本上也會轉化爲相同的東西 - 你怎麼沒有說過關於預期的結果,當你選擇寫一個或另一個。特別是,兩個版本在同一點短路相同的值。 –