各種與0比較的寫法

這是程序員面試的一道常見題,也是個C++基礎問題。若只在大學裏看過幾本基礎的編程入門書,看見這道題可能會覺得奇怪,不就是和0比較嗎,直接拿出來比就是了,其實非也。下文引自google搜索結果,出處不詳,高手可以無視,菜菜留下,記得做好筆記。

首先給個提示:題目中要求的是零值比較,而非與0進行比較,在C++裏“零值”的範圍可就大了,可以是0, 0.0 ,FALSE或者“空指針”。

①int型變量 n 與“零值”比較的 if 語句就是:
  1. if ( n == 0 )  
  1. if ( n != 0 )  
如下寫法均屬不良風格.。
  1. if ( n )  // 會讓人誤解 n 是布爾變量  
  1. if ( !n   )  
②請寫出 BOOL flag 與“零值”比較的 if 語句。
根據布爾類型的語義,零值爲“假”(記爲FALSE),任何非零值都是“真”(記爲TRUE)。TRUE 的值究竟是什麼並沒有統一的標準。例如Visual C++ 將TRUE 定義爲1,而Visual Basic 則將TRUE 定義爲-1。所以我們不可以將布爾變量直接與TRUE、FALSE 或者1、0 進行比較。
標準答案:
  1. if ( flag )  
  1. if ( !flag )  
如下寫法均屬不良風格。
  1. if (flag == TRUE)   
  1. if (flag == 1 )   
  1. if (flag == FALSE)   
  1. if (flag == 0)   
③請寫出 float x 與“零值”比較的 if 語句。
千萬要留意,無論是float 還是double 類型的變量,都有精度限制,都不可以用“==”或“!=”與任何數字比較,應該設法轉化成“>=”或“<=”形式。(爲什麼?文章之後有詳細的討論,可參考)

假設浮點變量的名字爲x,應當將

        if (x == 0.0)         // 隱含錯誤的比較

        轉化爲

        if ((x>=-EPSINON) && (x<=EPSINON))
       其中EPSINON 是允許的誤差(即精度)。
標準答案示例:
  1. const float EPSINON = 0.00001;  
  2. if ((x >= - EPSINON) && (x <= EPSINON){}  
如下是錯誤的寫法。
  1. if (x == 0.0)   
  2. if (x != 0.0)   
④請寫出 char *p 與“零值”比較的 if 語句。
標準答案:
  1. if (p == NULL)  
  2. if (p != NULL)  
如下寫法均屬不良風格。
  1. if (p == 0)         // 容易讓人誤解p是整型變量  
  2. if (p != 0)   
  3. if (p)                 // 容易讓人誤解p是bool型變量  
  4. if (!p)   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章