(转载请注明出处,射射)
参考文章:
《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子句顺序》