if-else语句注意事项

(转载请注明出处,射射)


参考文章:

《C语言if、else超级组合》

《c++ -if语句比较注意》


背景:

        不管是在C/C++还是其它语言的编程中,流程控制语句几乎是入门常识,而(if...else)语句算得上是最基本最简单的流程控制语句了。如果连这个都不会,那就不用编程了。

        但是,其实(if...else)语句的使用有一些技巧和注意事项,有可能对于那些有数年编程经验的开发人员来说,也未必会注意到。下面我将简单的归纳一下。

正文:

下面将从下面几点来阐述:

(1)bool变量与0,1

(2)“==”与“=”

(3)int变量与0比较

(4)float 变量与“零值”进行比较

(5)if语句中的指针型变量

(6)先处理正常情况,再处理异常情况


一、bool型与0,1

记得以前去面试的时候,偶尔会碰到一些比较奇葩的问题。其中一中就是给你一个不太常见的if语句,让你去分析结果。例如if(a-5)。对于这种题目,我往往只会回答一句:"fuck your flower!"

对于if语句中括号包含的内容,理论上只有真和假两种,但是到底真和假用什么值来表示呢?不同的语言、不同的平台定义是不一样的。就好像if(a-5)这句话,加入a=5,那就是if(0),但是问题是0表示真和假在不同的环境下是不同的,面试出个这样的题目,是鼓励人家写这种代码么???


C++的编程指南里面,人家推荐的风格是:

if (!flag) // 表示flag 为假

其它的用法都属于不良风格,例如:

if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)

具体我就不多说了。


二、“==”与“=”

没有碰到过这个问题的人,估计是没有写过C/C++程序的了。基本上,刚开始写程序的都会碰到这个坑,而且最坑的是编译器很多时候是不会报错或者有提示的(当然,现在的编译器聪明了很多),查起来非常困难。

知乎上面有这个讨论 对于这个问题,意见似乎不太统一。

(1)有人赞成if(常量==变量)的形式,因为有部分语言、编译器环境下,无法检测出把“==”写成“=”这种错误。

(2)有人认为写成上面那种形式有悖于人的思维习惯,不利于代码的阅读和理解。

个人在这里只是做个提醒,大家见仁见智吧。


三、int变量与0比较

假设整型变量的名字为value,它与零值比较的标准if 语句如下:

if (value == 0)
if (value != 0)

个人不太赞成如下这种写法
if (value) // 会让人误解 value 是布尔变量
if (!value)

四、float 变量与“零值”进行比较(下面引自《c++ -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) 


五、if语句中的指针型变量

标准写法

if (p == NULL)
if (p != NULL)

如下写法均属不良风格。
if (p == 0)        // 容易让人误解p是整型变量
if (p != 0) 
if (p)                // 容易让人误解p是bool型变量
if (!p)


六、逻辑顺序问题

        上面提到的那些,大部分都没有统一的说法,更多的时候是个人习惯的问题,个人在这里提出只是作为一个总结。但是关于if语句,个人强烈反对把复杂难以理解的语句放到if的条件里面,这样会严重影响代码的阅读。

        除了语法和习惯的问题,关于if/else语句最重要的其实是逻辑的问题。建议大家看一下:

《化简复杂逻辑,编写紧凑的if条件语句》

《化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件》

《化简复杂逻辑,编写紧凑的if条件语句(三):确定最简的if子句顺序》




你可能感兴趣的:(else,if,注意)