bool 变量与“零值”进行比较的if 语句怎么写?

这是程序员面试的一道常见题,也是个C++基础问题。若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也。下文引自google搜索结果,出处不详,高手可以无视,菜菜留下,记得做好笔记。

首先给个提示:题目中要求的是零值比较,而非与0进行比较,在C++里“零值”的范围可就大了,可以是0, 0.0 ,FALSE或者“空指针”。

①int型变量 n 与“零值”比较的 if 语句就是:
[cpp]  view plain copy
  1. if ==  
[cpp]  view plain copy
  1. if !=  
如下写法均属不良风格.。
[cpp]  view plain copy
  1. if  // 会让人误解 是布尔变量  
[cpp]  view plain copy
  1. if !n    
②请写出 BOOL flag 与“零值”比较的 if 语句。
根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE 的值究竟是什么并没有统一的标准。例如Visual C++ 将TRUE 定义为1,而Visual Basic 则将TRUE 定义为-1。所以我们不可以将布尔变量直接与TRUE、FALSE 或者1、0 进行比较。
标准答案:
[cpp]  view plain copy
  1. if flag  
[cpp]  view plain copy
  1. if !flag  
如下写法均属不良风格。
[cpp]  view plain copy
  1. if (flag == TRUE)   
[cpp]  view plain copy
  1. if (flag ==   
[cpp]  view plain copy
  1. if (flag == FALSE)   
[cpp]  view plain copy
  1. if (flag == 0)   
③请写出 float x 与“零值”比较的 if 语句。
千万要留意,无论是float 还是double 类型的变量,都有精度限制,都不可以用“==”或“!=”与任何数字比较,应该设法转化成“>=”或“<=”形式。(为什么?文章之后有详细的讨论,可参考)

假设浮点变量的名字为x,应当将

        if (x == 0.0)         // 隐含错误的比较

        转化为

        if ((x>=-EPSINON) && (x<=EPSINON))
       其中EPSINON 是允许的误差(即精度)。
标准答案示例:
[cpp]  view plain copy
  1. const float EPSINON 0.00001;  
  2. if ((x >= EPSINON) && (x <= EPSINON){}  
如下是错误的写法。
[cpp]  view plain copy
  1. if (x == 0.0)   
  2. if (x != 0.0)   
④请写出 char *p 与“零值”比较的 if 语句。
标准答案:
[cpp]  view plain copy
  1. if (p == NULL)  
  2. if (p != NULL)  
如下写法均属不良风格。
[cpp]  view plain copy
  1. if (p == 0)         // 容易让人误解p是整型变量  
  2. if (p != 0)   
  3. if (p)                 // 容易让人误解p是bool型变量  
  4. if (!p)   
  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算机基础与程序设计 一、单项选择题 1. 根据制造材料的不同,显示器分类中不含 【 】 A. 液晶显示器 B. 等离子显示器 C. 阳极射线管显示器 D. 阴极射线管显示器 2. 1946年诞生的世界上公认的第一台电子计算机是 【 】 A. UNIVAC-I B. EDVAV C. ENIAC D. IBM650 3. 关于如下程序结构的描述中,正确的是 【 】 for (;;) {循环体;} A. 不执行循环体 B. 一直执行循环体,即死循环 C. 执行循环体一次 D. 程序不符合语法要求 4. C#中每个char类型变量占用多少个字节。 【 】 A. 2 B. 4 C. 8 D. 10 5. Visual Studio 2008是以( )为单位来管理C#程序设计过程的。 【 】 A. 解决方案 B. 数据 C. 模块划分 D. 二进制 6. 有说明语句double[,] tab=new double[2,3];那么下面叙述正确的是 【 】 A. tab是一个数组维数不确定的数组,使用时可以任意调整 B. tab是一个有两个元素的一维数组,它的元素初始值分别是2、3 C. tab是一个二维数组,它的元素个数一共有6个 D. tab是一个不规则数组,数组元素的个数可以变化 7. 下面选项中正确描述了CheckBox控件的是 【 】 A. 当checked属性的值更改时,调引发CheckedChanged事件 B. 在一组复选框中,用户只能选择一个 C. 复选框不可以显示图像图标 D. 以上说法均正确 8. 值类型不包括以下哪一个类型。 【 】 A. 简单类型 B. 结构类型 C. 数据类型 D. 枚举类型 9. 下列判断语句中存在语法错误的是 【 】 bool a=true,b=false, bool c=true;int i=0; A. if(a""b) B. if(i) C. if(i!=3) D. if((i==3)==false) 10. 下列不属于分组控件的是 【 】 A. GroupBox B. TabControl C. Panel D. CheckBox 11. 调用重载方法时,系统根据( )来选择具体的方法。 【 】 A. 方法名 B. 参数的个数和类型 C. 参数名及参数个数 D. 方法的返回值类型 12. 假定int类型变量占用四个字节,若有定义: int[] x=new int[10]{0,2,4,4,5,6,7,8,9,10}; 则数组x在内存中所占字节数是 【 】 A. 6 B. 20 C. 40 D. 80 13. 以下哪个控件组合了TextBox控件和ListBox控件的功能。 【 】 A. ComboBox B. Label C. ListView D. DomainUpDown 14. 在C#中,下列程序的运行结果是 【 】 A. 4321 B. 1234 C. 4123 D. 3214 15. Convert类的方法包括 【 】 A. Tolnteger、ToBigger、ToData B. ToConvert、ToCurrentData C. ToInt32、ToInt64、ToSingle D. 以上选项都不对 16. 在C#中,类成员访问修饰符可以省略,默认为 【 】 A. public B. private C. internal D. protected 17. 下面关键字中不是用来修饰方法的参数的是 【 】 A. ref B. params C. out D. in 18. 数据库管理系统的英文缩是 【 】 A. DBMS B. DBS C. DBA D. DB 19. 公司中有多个部门和多名职员,每个职员只能属于一个部门,一个部门可以有多名职员 ,部门和职员的联系类型是 【 】 A. 多对多 B. 一对一 C. 多对一 D. 一对多 20. Graphics的什么方法用于画直线。 【 】 A. DrawLine方法 B. Line方法 C. DrawLineTo方法 D. PointToPoint方法 21. 在SQL Server中,下列关于用户数据库的说法正确的是 【 】 A. 一个用户数据库可以不包含日志文件 B. 一个用户数据库可以只包含一个日志文件和一个主数据库文件 C. 一个用户数据库可包含多个主数据库文件,但只能包含一个日志文件 D. 一个用户数据库可以包含多个日志文件和多个主数据库文件。 22. 在SELECT查询中,要把结果中的行按照某一列的值进行排序,所用到的子句是 【 】 A. ORDER BY B. WHERE C. GROUP BY D. HAVING 23. 瀑布模型的主要特点是 【 】 A. 将软件生命周期中的各项活动按固定次序自上而下地连接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值