2015-11-05 80 views
1

我最近繼承了一箇舊項目來進行一些優化並添加新功能。在這個項目中我見過這種類型的情況遍佈代碼:的有條件地忽略「> 0」嗎?

if (int_variable) 

代替

if (int_variable > 0) 

我已經使用了第一個選項只boolean類型的變量。

您認爲第一個選項是檢查數字是否爲正數的「正確」方法嗎?

+3

如果'int_variable'的類型實際上是'int',則不會。如果它是'未簽名',是的。 – EOF

+2

在C和C++中,任何非零值都被認爲是真的。負值也不爲零。 –

回答

9

負數還評估爲true,所以您應該使用if (int_variable > 0)來檢查數字是否爲正值。

+1

在C中,他們不評估任何東西 - 不確定C++。在一個條件中,他們只是被認爲是真實的(但不是'_Bool'常量'_True')。對於任何非零數字都是如此,不僅對於負值,這是正確的。 – Olaf

3

不是。第一個選項是檢查數字是否爲非零的正確方法。

2

任何非零值將被認爲是true,所以如果變量確實是int即有符號,那麼您的>版本有點簡略。爲了清楚起見,我更喜歡做的是明確在許多情況下,即寫

if (int_variable != 0) 

這也許是一個有點令人費解(基本上是計算一個布爾值,其中一個可以自動推斷),我永遠不會使用if (bool_variable == true)的實例,但我認爲整數情況會使測試更清晰。大聲朗讀這兩個例子對整數來說效果更好。

2

if (int_variable)if (int_variable != 0)的含義相同。

這和if (int_variable > 0)不一樣,除非你知道這個值永遠不會是負數。

1

當在C中使用整數值作爲真值時,零產生false,而任何非零值產生true

在你的情況下,假設int_variable簽訂後,(int_variable)相當於(int_variable > 0)因爲int_variable爲負將分別得到truefalse


所以

if (int_variable) { … } 

檢查int_variable是正的正確途徑。

1

在C中,評估爲整數0空指針的任何表達式都被認爲是錯誤的。還有其他的事情是真的。

所以基本上類似測試,如果

int i = ...; 
if (i) 

i爲0。但是,如果i爲負數,則條件也將爲真,因此這不是i > 0的替代品。 除非iunsigned。只是因爲他們不能消極。但是你的編譯器可能會警告這樣的構造,因爲它們經常表現出錯誤的概念。

即將到來的編碼風格,if (i)是壞的風格,如果你真的比較值0。您最好明確比較:if (i != 0)。但是,如果i包含一些布爾結果,則應使用「發音」名稱(例如,isalpha('A')使用ctypes.h函數而不是變量),並且不要進行比較。比較readbility:

char ch = ...; 

if (isalpha(ch)) 

if (isalpha(ch) != 0) 

對於你必須考慮第二個關於比較後者 - 不必要的。

+0

即使在'NULL!= 0x0'的體系結構中,這是否也是如此? –

+0

@ Mr.E:這就是爲什麼我寫了「_null指針constant_」C(不確定C++,但相當肯定),不需要空指針常量爲「全零位」。 – Olaf

+0

我知道NULL不是0,但從來沒有聽說過2個不同的整數值是'false'。謝謝 –