我最近繼承了一箇舊項目來進行一些優化並添加新功能。在這個項目中我見過這種類型的情況遍佈代碼:的有條件地忽略「> 0」嗎?
if (int_variable)
代替
if (int_variable > 0)
我已經使用了第一個選項只boolean
類型的變量。
您認爲第一個選項是檢查數字是否爲正數的「正確」方法嗎?
我最近繼承了一箇舊項目來進行一些優化並添加新功能。在這個項目中我見過這種類型的情況遍佈代碼:的有條件地忽略「> 0」嗎?
if (int_variable)
代替
if (int_variable > 0)
我已經使用了第一個選項只boolean
類型的變量。
您認爲第一個選項是檢查數字是否爲正數的「正確」方法嗎?
負數還評估爲true
,所以您應該使用if (int_variable > 0)
來檢查數字是否爲正值。
在C中,他們不評估任何東西 - 不確定C++。在一個條件中,他們只是被認爲是真實的(但不是'_Bool'常量'_True')。對於任何非零數字都是如此,不僅對於負值,這是正確的。 – Olaf
不是。第一個選項是檢查數字是否爲非零的正確方法。
任何非零值將被認爲是true
,所以如果變量確實是int
即有符號,那麼您的>
版本有點簡略。爲了清楚起見,我更喜歡做的是明確在許多情況下,即寫
if (int_variable != 0)
這也許是一個有點令人費解(基本上是計算一個布爾值,其中一個可以自動推斷),我永遠不會使用if (bool_variable == true)
的實例,但我認爲整數情況會使測試更清晰。大聲朗讀這兩個例子對整數來說效果更好。
if (int_variable)
與if (int_variable != 0)
的含義相同。
這和if (int_variable > 0)
不一樣,除非你知道這個值永遠不會是負數。
當在C中使用整數值作爲真值時,零產生false
,而任何非零值產生true
。
在你的情況下,假設int_variable簽訂後,(int_variable)
是不相當於(int_variable > 0)
因爲int_variable
爲負將分別得到true
和false
。
所以
if (int_variable) { … }
是不檢查int_variable
是正的正確途徑。
在C中,評估爲整數0
或空指針的任何表達式都被認爲是錯誤的。還有其他的事情是真的。
所以基本上類似測試,如果
int i = ...;
if (i)
i
爲0。但是,如果i
爲負數,則條件也將爲真,因此這不是i > 0
的替代品。 除非i
是unsigned
。只是因爲他們不能消極。但是你的編譯器可能會警告這樣的構造,因爲它們經常表現出錯誤的概念。
即將到來的編碼風格,if (i)
是壞的風格,如果你真的比較值0
。您最好明確比較:if (i != 0)
。但是,如果i
包含一些布爾結果,則應使用「發音」名稱(例如,isalpha('A')
使用ctypes.h
函數而不是變量),並且不要進行比較。比較readbility:
char ch = ...;
if (isalpha(ch))
if (isalpha(ch) != 0)
對於你必須考慮第二個關於比較後者 - 不必要的。
即使在'NULL!= 0x0'的體系結構中,這是否也是如此? –
@ Mr.E:這就是爲什麼我寫了「_null指針constant_」C(不確定C++,但相當肯定),不需要空指針常量爲「全零位」。 – Olaf
我知道NULL不是0,但從來沒有聽說過2個不同的整數值是'false'。謝謝 –
如果'int_variable'的類型實際上是'int',則不會。如果它是'未簽名',是的。 – EOF
在C和C++中,任何非零值都被認爲是真的。負值也不爲零。 –