这是程序员面试的一道常见题,也是个C++基础问题。若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也。下文引自google搜索结果,出处不详,高手可以无视,菜菜留下,记得做好笔记。 1).int型变量 n 与“零值”比较的 if 语句就是: if ( n == 0 ) if ( n != 0 ) 如下写法均属不良风格.。 if ( n ) // 会让人误解 n 是布尔变量 if ( !n ) 2).请写出 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) 3).请写出 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) 4).请写出 char *p 与“零值”比较的 if 语句。 标准答案: if (p == NULL) if (p != NULL) 如下写法均属不良风格。 if (p == 0) // 容易让人误解p是整型变量 if (p != 0) if (p) // 容易让人误解p是bool型变量 if (!p) 以 上的不良风格很多都能通过编译,但是语句并不能很好的表达与零值进行比较的逻辑依据。一般的,如果想用 if 语句判断一个变量的真假,应该直接使用if(var)、if(!var),表明此 if 语句的功能为“逻辑”判断;如果想用 if 语句判断一个数值型变量(short、int、long等),应该用if(var==0),表明此 if 语句是将变量与0进行“数值”上的比较;而检视指针是否为空则适宜用if(var==NULL),这是一种很好的编程习惯。 ---------------------------------------------------------------------------------------------------------------------------------------- 浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。以下给出详细原因: 再看下面优快云上的回答 引用 float x 与“零值”比较的if 浮点数是不可以直接比较大小的,因为是非精确存储,只能设置一个精度,然后在允许误差内的就认为是相等的;对浮点型数比较的时候用==是不对的 #define E 0.000001 fabs((a+b)+c) - ((b+a)+c))
原文 http://hi.baidu.com/kuhntoria/blog/item/50355259edce2658faf2c053.html |
c++ 零值比较
最新推荐文章于 2022-02-19 10:13:15 发布