這是程序員面試的一道常見題,也是個C++基礎問題。若只在大學裏看過幾本基礎的編程入門書,看見這道題可能會覺得奇怪,不就是和0比較嗎,直接拿出來比就是了,其實非也。下文引自google搜索結果,出處不詳,高手可以無視,菜菜留下,記得做好筆記。
首先給個提示:題目中要求的是零值比較,而非與0進行比較,在C++裏“零值”的範圍可就大了,可以是0, 0.0 ,FALSE或者“空指針”。①int型變量 n 與“零值”比較的 if 語句就是:
- if ( n == 0 )
- if ( n != 0 )
- if ( n ) // 會讓人誤解 n 是布爾變量
- if ( !n )
根據布爾類型的語義,零值爲“假”(記爲FALSE),任何非零值都是“真”(記爲TRUE)。TRUE 的值究竟是什麼並沒有統一的標準。例如Visual C++ 將TRUE 定義爲1,而Visual Basic 則將TRUE 定義爲-1。所以我們不可以將布爾變量直接與TRUE、FALSE 或者1、0 進行比較。
標準答案:
- if ( flag )
- if ( !flag )
- if (flag == TRUE)
- if (flag == 1 )
- if (flag == FALSE)
- if (flag == 0)
千萬要留意,無論是float 還是double 類型的變量,都有精度限制,都不可以用“==”或“!=”與任何數字比較,應該設法轉化成“>=”或“<=”形式。(爲什麼?文章之後有詳細的討論,可參考)
假設浮點變量的名字爲x,應當將
if (x == 0.0) // 隱含錯誤的比較
轉化爲
if ((x>=-EPSINON) && (x<=EPSINON))其中EPSINON 是允許的誤差(即精度)。
標準答案示例:
- const float EPSINON = 0.00001;
- if ((x >= - EPSINON) && (x <= EPSINON){}
- if (x == 0.0)
- if (x != 0.0)
標準答案:
- if (p == NULL)
- if (p != NULL)
- if (p == 0) // 容易讓人誤解p是整型變量
- if (p != 0)
- if (p) // 容易讓人誤解p是bool型變量
- if (!p)