您的位置:首页 > 其它

C 判断 —— if...else 语句(bool变量、float变量、指针变量与“零值”进行比较)(else 到底与哪个 if 配对呢? if 语句后面的分号?)

2018-11-07 17:15 489 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42167759/article/details/83824014

1、bool 变量与“零值”进行比较

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

bool bTestFlag = FALSE;//想想为什么一般初始化为 FALSE 比较好?
A), if(bTestFlag == 0); if(bTestFlag == 1);
B), if(bTestFlag == TRUE); if(bTestFlag == FLASE);
C), if(bTestFlag); if(!bTestFlag);
哪一组或是那些组正确呢?我们来分析分析:
A)写法: bTestFlag 是什么?整型变量?如果要不是这个名字遵照了前面的命名规范,
肯怕很容易让人误会成整型变量。所以这种写法不好。
B)写法: FLASE 的值大家都知道,在编译器里被定义为 0;但 TRUE 的值呢?都是 1
吗?很不幸,不都是 1。 Visual C++定义为 1,而它的同胞兄弟 Visual Basic 就把 TRUE 定义
为-1.那很显然,这种写法也不好。
大家都知道 if 语句是靠其后面的括号里的表达式的值来进行分支跳转的。表达式如果
为真,则执行 if 语句后面紧跟的代码;否则不执行。那显然,本组的写法很好,既不会引
起误会,也不会由于 TRUE 或 FLASE 的不同定义值而出错。记住:以后写代码就得这样写。

2、float 变量与“零值”进行比较

float 变量与“零值”进行比较的 if 语句怎么写?
float fTestVal = 0.0;
A), if(fTestVal == 0.0); if(fTestVal != 0.0);
B), if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 为定义好的
精度。
哪一组或是那些组正确呢?我们来分析分析:
float 和 double 类型的数据都是有精度限制的,这样直接拿来与 0.0 比,能正确吗?明显
不能,看例子: 的值四舍五入精确到小数点后  10 位为: 3.1415926536,你拿它减去
0.00000000001 然后再四舍五入得到的结果是多少?你能说前后两个值一样吗?
EPSINON 为定义好的精度,如果一个数落在[0.0-EPSINON,0.0+EPSINON] 这个闭区间
内,我们认为在某个精度内它的值与零值相等;否则不相等。扩展一下,把 0.0 替换为你想
比较的任何一个浮点数,那我们就可以比较任意两个浮点数的大小了,当然是在某个精度
内。
同样的也不要在很大的浮点数和很小的浮点数之间进行运算,比如:
10000000000.00 + 0.00000000001
这样计算后的结果可能会让你大吃一惊。

3、指针变量与“零值”进行比较

指针变量与“零值”进行比较的 if 语句怎么写?
int * p = NULL;//定义指针一定要同时初始化,指针与数组那章会详细讲解。
A), if(p == 0); if(p != 0);
B), if(p); if(!p);
C) , if(NULL == p); if(NULL != p);
哪一组或是那些组正确呢?我们来分析分析:
A)写法: p 是整型变量?容易引起误会,不好。尽管 NULL 的值和 0 一样,但意义不同。
B)写法: p 是 bool 型变量?容易引起误会,不好。
C)写法:这个写法才是正确的,但样子比较古怪。为什么要这么写呢?是怕漏写一个
“ =”号:if(p = NULL),这个表达式编译器当然会认为是正确的,但却不是你要表达的意思。
所以,非常推荐这种写法。
 

else 到底与哪个 if 配对呢?

else 常常与 if 语句配对,但要注意书写规范,看下面例子:
if( 0 == x)
if( 0 == y) error();
else{
//program code
}
这个 else 到底与谁匹配呢?让人迷糊,尤其是初学者。还好, C 语言有这样的规定: else
始终与同一括号内最近的未匹配的 if 语句结合。

 

if 语句后面的分号

关于 if-else 语句还有一个容易出错的地方就是与空语句的连用。看下面的例子:
if(NULL != p) ;
fun();
这里的 fun()函数并不是在 NULL != p 的时候被调用,而是任何时候都会被调用。问题就出
在 if 语句后面的分号上。在 C 语言中,分号预示着一条语句的结尾,但是并不是每条 C 语
言语句都需要分号作为结束标志。if 语句的后面并不需要分号, 但如果你不小心写了个分号,
编译器并不会提示出错。因为编译器会把这个分号解析成一条空语句。也就是上面的代码实
际等效于:
if(NULL != p)
{
;
}
fun();
这是初学者很容易犯的错误,往往不小心多写了个分号,导致结果与预想的相差很远。所
以建议在真正需要用空语句时写成这样:
NULL;
而不是单用一个分号。这就好比汇编语言里面的空指令,比如 ARM 指令中的 NOP 指令。
这样做可以明显的区分真正必须的空语句和不小心多写的分号。

使用 if 语句的其他注意事项

【规则 1-17】先处理正常情况,再处理异常情况。
在编写代码是,要使得正常情况的执行代码清晰,确认那些不常发生的异常情况处理
代码不会遮掩正常的执行路径。这样对于代码的可读性和性能都很重要。因为, if 语句总是
需要做判断,而正常情况一般比异常情况发生的概率更大(否则就应该把异常正常调过来
了),如果把执行概率更大的代码放到后面,也就意味着 if 语句将进行多次无谓的比较。另
外,非常重要的一点是,把正常情况的处理放在 if 后面,而不要放在 else 后面。当然这也
符合把正常情况的处理放在前面的要求。
【规则 1-18】确保 if 和 else 子句没有弄反。
这一点初学者也容易弄错,往往把本应该放在 if 语句后面的代码和本应该放在 else 语
句后面的代码弄反了。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: