與0值比較的那些事

2021-12-29 23:49:42 字數 2357 閱讀 4293

在條件判斷的時候,我們經常會碰到與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的而且是不管你如何設定或者處理,都不允許你重新...