发一下牢骚和主题无关:
在条件判断的时候,我们经常会碰到与0值比拟的情况,但是通常有很多人使用时采用不恰当的条件判断。上面我们就详细讨论各种情况:
1. 布尔变量与零值的比拟:
假设布尔变量的变量名为flag,则它和0值比拟的条件判断语句如下:
if(flag)
//表示flag为真
if(!flag)
//表示flag为假
原因:根据布尔类型的语义,0为假,任何非0都为真,也许有人会认为那直接用上面这类写法也行啊,
if(flag != 0)
//表示flag为真
if(flag == 0)
//表示flag为假
根据定义,似乎是对的,当然,在程序中也不会错,但是我们会以为这是布尔类型和整型的比拟,类型
不匹配!当然,还有上面一种方法。
if(flag == TRUE)
//表示flag为真
if(flag == FALSE)
//表示flag为假
不错,对于很多语言,都有这两个关键字,而且FALSE被定义为0,但是只要TRUE,大多数语言都将其定义
为1,而这却没有遵循布尔类型的定义(非零表示真),这样的比拟就会出现bug,比如flag=2时,就不会执行flag为真时的语句。
综上所述,布尔类型的变量和0值比拟是应采用以下写法:
if(flag)
//表示flag为真
if(!flag)
//表示flag为假
2. 整型变量和零值的比拟:
这中情况就很简略了,就是上面的写法:
if(flag != 0)
//表示flag为真
if(flag == 0)
//表示flag为假
3. 浮点数与零值的比拟:
对于浮点数与零值的比拟,就绝对复杂一些。因为计算机表示浮点数都有一个精度限制。对于超出了精度限制的浮点数,计算机
会把它们的精度以外的小数部分截断。因此,原来不相等的两个浮点数在计算机中可能就酿成相等的了。
float a = 2.111111112;
float a = 2.111111118;
理论上,这两个数是不相等的,但是在32为呆板上是相等的(原因:在32位呆板上,float保存6为小数)。
所以,对于浮点数比拟,是这样规定的:如果两个同符号浮点数之差绝对值销毁或等于某一个可接受的误差(即精度),就以为
它们是相等的,否则就是不相等的。至于精度应根据详细要求而定。而不要直接用“==”或“!=”对两个浮点数停止比拟
float sub = 0.0000001f;
//自定义的精度
if(abs(a - b) <= sub);
//表示a == b;
if(abs(a - b) > sub);
//表示a != b;
而与零值的比拟,当然就是上面的写法了:
if(abs(a) <= sub);
//表示a == 0;
if(abs(a) > sub);
//表示a != 0;
注意:在实际的编程环境中,如果直接比拟浮点数和另一个数(整型或浮点数)是不是相等(==)或不等(!=),可能产生错误。
至于其结果,可能依赖于详细的编译环境和平台,因为每个编译平台都有自己默许的精度,对于浮点数直接停止==和!=比拟
采用的就是这个默许的精度,而不是按照内存中两个唯一某个bit不同来判断的。
4. 指针变量与零值的比拟:
指针变量的零值是“空值”(即为NULL),即不指向任何对象。
所以指针变量与零值比拟的标准if语句如下:
if(p == NULL)
//p为空
if(p != NULL)
//p不为空
虽然NULL的值与0雷同,但是两者意义不同。打开VC环境下的NULL定义:
/* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
也就是说NULL是定义的一个宏,这样即可区分整型与0值的比拟;
如果使用上面的写法:
if(p != 0)
//表示flag为NULL
if(p == 0)
//表示flag为NULL
当然,这样也不会错,但是我们会误以为p是整型变量。
虽然这都是一些很小的方面,但是程序中难以查找的bug往往就是出现在这些细节的地方!
文章结束给大家分享下程序员的一些笑话语录: 姿势要丰富,经常上百度!
---------------------------------
原创文章 By
浮点数和变量
---------------------------------