这是程序员面试的一道常见题,也是个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
分享到:
相关推荐
一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) ...
* bool、float、指针变量与“零值”比较的if语句 + bool类型变量flag与“零值”比较的if语句为:if (flag)和if (!flag) + float类型变量x与“零值”比较的if语句为:if ((x >= -EPSINON) && (x )) + 指针变量p与...
本文档总结了中标软件面试题部分,涵盖了BOOL、float、指针变量与“零值”比较的if语句,sizeof操作符的使用,头文件中的ifndef/define/endif的作用,include语句的区别,const关键字的用途,extern "C"的作用,for...
通过天轰穿老师的视频教程,观众不仅能学习到预定义数据类型的用法,还能了解到如何在实践中应用它们,例如在控制流结构(如if语句和循环)中,以及在函数参数和返回值中。此外,视频可能还会涵盖变量的声明、初始化...
笔试题目涵盖了 BOOL、float、指针变量与“零值”比较的if语句、sizeof的使用、头文件中的ifndef/define/endif的作用、const的用途、extern "C"的作用、for循环的优缺点、内存管理和strcpy函数的实现等方面。...
bool, float, 指针变量与“零值”的比较 - **bool变量与零值的比较** - **if语句**:`if(flag)` 和 `if(!flag)` - **解析**:`bool` 类型变量通常只有两个可能的值:`true` 和 `false`。在C语言中,`true` 对应非...
- 比较`bool`变量与零值的if语句: ```c if (flag) // 如果flag非零(即为true) if (!flag) // 如果flag为零(即为false) ``` 2. **浮点数比较**: - 比较浮点数时,不能直接使用"=="或"!=",因为浮点数的...
本资源摘要信息中,我们将对C++基础知识进行总结和分析,涵盖了BOOL、float、指针变量与“零值”比较的if语句、sizeof的计算、头文件中的ifndef/define/endif的用途、const的用途、extern “C”声明的作用、for循环...
一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分) 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) ...
- 对于`bool`类型的变量`flag`,与"零值"比较的正确if语句应为: ```c if (flag) // 如果flag为真(非零) if (!flag) // 如果flag为假(零) ``` - 对于`float`类型的变量`x`,由于浮点数比较时不能直接使用...
#### 一、与“零值”比较的if语句 **1. BOOL变量与“零值”比较** - **正确写法:** - `if (flag)` - `if (!flag)` - **错误写法:** - `if (flag == TRUE)` - `if (flag == 1)` - `if (flag == FALSE)` - `...
一、BOOL、float、指针变量与“零值”比较的if语句: - 对于BOOL类型的flag,与“零值”(FALSE)比较的if语句为: ```cpp if (!flag) ``` - 对于float类型的x,与“零值”(0.0f)比较的if语句为: ```cpp if (x ==...
根据提供的文件信息,“程序设计(第四版)谭浩强扫描版.pdf”作为计算机技术与软件技术水平考试中级程序设计师指定教材,其内容涵盖了程序设计的基本原理和技术。虽然未给出具体内容,但我们可以基于书名、描述以及...
#### 面试题2:写出bool、int、float、指针变量与“零值”比较的if语句 对于不同的数据类型,与零值比较的方式也有所不同: - **bool型数据**: ```cpp if (flag) { // ... } else { // ... } ``` 这里`...
试题时间为120分钟,测试内容包括bool、double、指针变量与“零值”的比较,以及sizeof运算符的使用,并对头文件包含、const关键字和迭代器等概念进行了简答。 一、bool、double、指针变量与“零值”的比较 1. ...
- 指针简介:指针变量存储其他变量的地址,可以用来间接访问和修改该变量。 - 指针与常量:可以创建指向常量的指针,防止通过指针修改所指的值。 - 指针与数组:指针可以用来遍历和操作数组。 - 指针与函数:...
- `bool`与零值比较:`if (flag)`(表示flag为真)或 `if (!flag)`(表示flag为假) - `float`与零值比较:通常需要一个误差范围,例如 `const float EPSILON = 0.00001; if ((x >= -EPSILON) && (x ))` - 指针与...
- `float` 类型的零比较通常需要一个小的误差范围,例如 `if (a < EXP && a > -EXP)`,这里的 `EXP` 是一个极小的浮点数,用来处理浮点数的近似零。 - `指针` 类型的零比较使用 `if (a != NULL)` 或 `if (a == ...