在條件判斷的時候,我們經常會碰到與0值比較的情況,但是通常有許多人使用時採用不恰當的條件判斷。下面我們就詳細討論各種情況:
1. 布林變數與零值的比較:
假設布林變數的變數名為flag,則它和0值比較的條件判斷語句如下:
if(flag) //表示flag為真
if(!flag) //表示flag為假
原因:根據布林型別的語義,0為假,任何非0都為真,也許有人會覺得那直接用下面這種寫法也行啊,
if(flag != 0) //表示flag為真
if(flag == 0) //表示flag為假
根據定義,似乎是對的,當然,在程式中也不會錯,但是我們會以為這是布林型別和整型的比較,型別
不匹配!當然,還有下面一種方法。
if(flag == true)//表示flag為真
if(flag == false)//表示flag為假
不錯,對於許多語言,都有這兩個關鍵字,而且false被定義為0,但是只要true,大多數語言都將其定義
為1,而這卻沒有遵循布林型別的定義(非零表示真),這樣的比較就會出現bug,比如flag=2時,就不會執行flag為真時的語句。
綜上所述,布林型別的變數和0值比較是應採用以下寫法:
if(flag) //表示flag為真
if(!flag) //表示flag為假
2. 整型變數和零值的比較:
這中情況就很簡單了,就是下面的寫法:
if(flag != 0) //表示flag為真
if(flag == 0) //表示flag為假
3. 浮點數與零值的比較:
對於浮點數與零值的比較,就相對複雜一些。因為計算機表示浮點數都有乙個精度限制。對於超出了精度限制的浮點數,計算機
會把它們的精度之外的小數部分截斷。因此,本來不相等的兩個浮點數在計算機中可能就變成相等的了。
float a = 2.111111112;
float a = 2.111111118;
理論上,這兩個數是不相等的,但是在32為機器上是相等的(原因:在32位機器上,float保留6為小數)。
所以,對於浮點數比較,是這樣規定的:如果兩個同符號浮點數之差絕對值銷毀或等於某乙個可接受的誤差(即精度),就認為
它們是相等的,否則就是不相等的。至於精度應根據具體要求而定。而不要直接用「==」或「!=」對兩個浮點數進行比較
float sub = 0.0000001f;//自定義的精度
if(abs(a - b) <= sub);//表示a == b;
if(abs(a - b) > sub);//表示a != b;
而與零值的比較,當然就是下面的寫法了:
if(abs(a) <= sub);//表示a == 0;
if(abs(a) > sub);//表示a != 0;
注意:在實際的程式設計環境中,如果直接比較浮點數和另乙個數(整型或浮點數)是否相等(==)或不等(!=),可能產生錯誤。
至於其結果,可能依賴於具體的編譯環境和平台,因為每乙個編譯平台都有自己預設的精度,對於浮點數直接進行==和!=比較
採用的就是這個預設的精度,而不是按照記憶體中兩個僅有某個bit不同來判斷的。
4. 指標變數與零值的比較:
指標變數的零值是「空值」(即為null),即不指向任何物件。
所以指標變數與零值比較的標準if語句如下:
if(p == null) //p為空
if(p != null) //p不為空
雖然null的值與0相同,但是兩者意義不同。開啟vc環境下的null定義:
[cpp]
/* define null pointer value */
#ifndef null
#ifdef __cplusplus
#define null 0
#else
#define null ((void *)0)
#endif
#endif
/* define null pointer value */
#ifndef null
#ifdef __cplusplus
#define null 0
#else
#define null ((void *)0)
#endif
#endif
也就是說null是定義的乙個巨集,這樣便可區分整型與0值的比較;
如果使用下面的寫法:
if(p != 0) //表示flag為null
if(p == 0) //表示flag為null
當然,這樣也不會錯,但是我們會誤以為p是整型變數。
雖然這都是一些很小的方面,但是程式中難以查詢的bug往往就是出現在這些細節之處!
網頁權重值的那些事
對於搜尋引擎來講,在搜尋引擎中展示出來的網頁都是按照網頁重要性來進行排序的,換句話說,也就是搜尋結果中的每個結果都有一定的網頁權重值,網頁權重值決定其排序結果,也就是網頁為什麼靠前的原因。網頁權重值是如何得來的 1.網頁基本權重 2.網頁的鏈結權重 3.網頁的使用者評價值。首先 如何你正在安排乙個 ...
group by 與 distinct 的那些事
之前沒有深究過這兩個關鍵字的區別,一直都是為了用而用,只知道需要去重了就用distinct,需要分組的時候就用group by。但是具體什麼時候用哪個,以及他們的效率如何知不道。但是最近做專案就遇到了乙個非常奇葩的問題,場景是這樣的 我需要查詢某個使用者的所有選單項,需要關聯查詢,但是用distin...
Cognos與Firefox的那些事
最近懷著一顆好奇的心裝了win10系統,作為乙個coder,或多或少的這麼久以來對於它的相容性還是秉著一顆質疑的態度。但是一切事情都要敢於嘗試,畢竟win10的使用者體驗還是很好的。和預料的一樣,問題馬上就出現了,我們都知道win10帶的瀏覽器是ie11的而且是不管你如何設定或者處理,都不允許你重新...