這是程序員面試的一道常見題,也是個C++基礎問題。若只在大學里看過幾本基礎的編程入門書,看見這道題可能會覺得奇怪,不就是和0比較嗎,直接拿出來比就是了,其實非也。下文引自google搜索結果,出處不詳,高手可以無視,菜菜留下,記得做好筆記。
首先給個提示:題目中要求的是零值比較,而非與0進行比較,在C++里“零值”的范圍可就大了,可以是0, 0.0 , FALSE或者“空指針”。int型變量 n 與“零值”比較的 if 語句就是:
if ( n == 0 ) if ( n != 0 ) 如下寫法均屬不良風格.。 if ( n ) // 會讓人誤解 n 是布爾變量 if ( !n )
請寫出 BOOL flag 與“零值”比較的 if 語句。
根據布爾類型的語義,零值為“假”(記為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 x 與“零值”比較的 if 語句。
千萬要留意,無論是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)
請寫出 char *p 與“零值”比較的 if 語句。
標准答案:
if (p == NULL) if (p != NULL) 如下寫法均屬不良風格。 if (p == 0) // 容易讓人誤解p是整型變量 if (p != 0) if (p) // 容易讓人誤解p是bool型變量 if (!p)
