`
duyouhua1214
  • 浏览: 228189 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

零值比较--BOOL,int,float,指针变量与零值比较的if语句

 
阅读更多

这是程序员面试的一道常见题,也是个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)

以 上的不良风格很多都能通过编译,但是语句并不能很好的表达与零值进行比较的逻辑依据。一般的,如果想用 if 语句判断一个变量的真假,应该直接使用if(var)、if(!var),表明此 if 语句的功能为“逻辑”判断;如果想用 if 语句判断一个数值型变量(short、int、long等),应该用if(var==0),表明此 if 语句是将变量与0进行“数值”上的比较;而检视指针是否为空则适宜用if(var==NULL),这是一种很好的编程习惯。

浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。以下给出详细原因:
浮点数在内存中的存贮机制和整型数不同,有舍入误差,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。
所以浮点数在运算过成功运算通常伴随着因为无法精确表示而进行的近似或舍入。但是这种设计的好处是可以在固定的长度上存储更大范围的数。
例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。
所以浮点数不能够判断相等,像 if(x==0)的这样的编码是不总是正确的,我们在判断浮点数相等时,推荐用范围来确定,若x在某一范围内,我们就认为相等,至于范围怎么定义,要看实际情况而已了,float,和double 各有不同
所以const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON) 这样判断是可取的
至于为什么取0.00001,可以自己按实际情况定义。

 

来源:http://hi.baidu.com/shihunjiangjie/blog/item/8d0da101b91352004afb51a9.html

分享到:
评论

相关推荐

    大学生毕业面试软件工程师面试题,C++试题

    一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) ...

    c++ 面试题 总结

    系统会初始化static int变量为0,但该值会一直保存,所谓的不可重入... -------------------------------------------------------------------------- 13.写出运行结果: {// test1 char str[] = "world"; cout (str...

    [面试/笔试系列9]C/C++经典面试题

    面试题1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, ...面试题2:写出bool 、int、 float、指针变量与“零值”比较的if 语句

    C++编程指南

    一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) ...

    Objective-C2.0程序设计

    2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 3.2 实例和方法 3.3 用于处理分数的Objective-C类 3.4 @interface部分 3.4.1 选择名称 3.4.2 实例变量 3.4.3 类和实例方法 3.5 @...

    c语言深度剖析

    1.6.3,指针变量与“零值”进行比较....... 1.6.4,else到底与哪个 if配对呢?.......1.6.6,使用if语句的其他注意事项...... 1.7,switch、case组合................................... 1.7.1,不要拿青龙偃月刀去...

    HGE_系列教材(1-9)

    值相乘,红色的值与红色的值相乘,绿色的值与绿色的值相乘,蓝色的值与蓝色的值相乘。 &lt;2&gt; 颜色是可以相加的 同上,对应分量相加。 颜色的每个分量使用浮点数表示,范围是[0-1],相加操作可能导致溢出,一种处理的...

    新手学习C++入门资料

    如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1或0。要把一个整型变量转换成布尔型变量,如果整型值为0,则其布尔型值为假;反之如果整型值为非0,则其布尔型值为真。布儿型变量在运行时通常...

    在一小时内学会 C#(txt版本)

    public bool IsLeapYear(int year) { return year%4== 0 ? true: false; } public void SetDate (int day, int month, int year) { this.day = day; this.month = month; this.year = year; } } 这里是你...

    C语言深度揭秘

    1.6.3,指针变量与“零值”进行比较.....................21 1.6.4,else到底与哪个 if配对呢?.....................22 1.6.5,if语句后面的分号..................................... 23 1.6.6,使用if语句的其他...

    C# for CSDN 乱七八糟的看不懂

    abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit ...

    C 语言深度解剖--解开程序员面试笔试的秘密

    1.6.3,指针变量与“零值”进行比较............................................................................... 21 1.6.4,else 到底与哪个 if 配对 呢?.................................................

    C语言深度解剖.zip

    1.6.3,指针变量与“零值”进行比较...............................................................................21 1.6.4,else 到底与哪个if 配对呢?.......................................................

    C语言深度解剖(完美版).pdf

    1.6.3,指针变量与“零值”进行比较...............................................................................21 1.6.4,else 到底与哪个if 配对呢?.......................................................

    C语言深度解剖_word版

    1.6.3,指针变量与“零值”进行比较...............................................................................21 1.6.4,else 到底与哪个if 配对呢?.......................................................

    C语言深度解剖

    1.6.3,指针变量与“零值”进行比较............................................................................... 21 1.6.4,else 到底与哪个 if 配对呢?.....................................................

Global site tag (gtag.js) - Google Analytics