C语言,是全球使用最多的编程语言。上次我们谈到了switch语句,但在C语言中,if条件构成的选择结构程序很重要。在实际问题中,往往需要对不同变量进行比较,然后分别执行不同的语句。如何使用if语句呢?小编在这里谈一谈if语句基本用法与使用技巧。
一、if语句
在操作符章节中我们学习过问号表达式,也就是当某一个条件表达式是真时,问号表达式的结果为冒号前的结果,当条件表达式是假时,问号表达式的结果为冒号后的结果。这里我们可以分析一下,问号表达式其实是一个条件判断功能表达式,也就是说:
如果条件表达式的值为真:
那么结果为A;
否则:
那么结果为B。
其实这是一个我们在生活常常需要处理的一种情形,如果……那么……否则……那么……
二、 if语句基本用法
if语句基本用法有如下四种形式,我们以求ab中的最大值为例,分别来看看。
1) 简单的if语句形式
if(某条件)执行某项操作。如图的if语句,即如果a<b,另a=b,使a成为最大值,最后输出
该语句形式的语义是:如果表达式为真,则执行语句块;否则,将跳过该语句块,执行整个if分支语句后面的其它语句。上述语句块,可以是一条语句,也可以是多条语句组合。
2) if-else语句形式
if(表达式)语句a
else 语句b,即满足表达式时,执行语句a,否则执行语句b
该语句形式的语义是:如果表达式为真,则执行语句块1;否则,执行语句块2。也就是说语句块1和语句块2两者必执行其一。然后,再执行整个if分支语句后面的其它语句。
3) if-else-if语句形式
if(表达式1)语句1
else if(表达式2)语句2
else 语句3
即满足表达式1时,执行语句1,不满足表达式1,但满足表达式2时,执行语句2,都不满足执行语句3
该语句形式的语义是,如果依次判断各表达式,若表达式为真,就执行对应的语句块,然后跳出整个if分支语句,执行后面的语句;如果前m个表达式均不为真,则会执行语句块n,然后再跳出整个if分支语句,执行后面的语句;也就是整个if分支语句的n个语句块,程序必定会执行其一。
4) if语句嵌套形式
即在if语句内写入其他if语句,如图
所谓的if语句嵌套形式是指if语句某一分支里又是一个if语句。通俗的理解是,前三种用法形式里的语句块,又是一个if语句,而且可以是前三种用法形式的任一种。C语言的C89标准指明,编译程序必须最少支持15层嵌套;C99标准把限度提升到127层。不过虽然支持这么多层嵌套,但实际编程应用时,为了保持程序的可读性及简洁程度,应尽量减少嵌套层次。
三、 if语句用法技巧
1) 合理调整if分支顺序
在编程应用时,应合理调整if分支顺序,把大概率为真对应情况的语句块直接放在if后面,不要放在else后面。这样做有利于减少程序的判断次数,提高执行效率。
例如,我们把学生成绩分成60分及以上、40-60分、40分以下三个分数段。很显然,及格的学生是大多数,也就是某个学生及格的可能性较大,低于60分较少,低于40分的更少。在编程处理学生成绩的应用时,通常用if-else-if语句形式,就应该把60分及以上的学生处理情况直接放到if语句之后,40-60分段放到else if语句后面,低于40分的情况放到else语句后面处理,这种安排很符合大家的逻辑思维习惯。如果把顺序颠倒,if语句处理40分以下,else if语句处理40-60分段,60分及以上放到else语句后面,无形中增加了成倍的成绩比较次数。
2) else结合问题
C语言if语句编程应用时,应该注意else的配对问题,它始终与最近的未匹配的if相结合。如果不注意该问题,有可能程序执行结果与预期相去甚远。请看下面的例子说明。
if(表达式1)
if(表达式2)
语句块1;
else
语句块2;
上面的例子我们来看,作者的意图是,如果表达式1与表达式2均为真的情况下,执行语句块1;如果表达式1为假,则执行语句块2。这里虽然else与表达式1的if对齐,但它们并不能配对;事实上else是与表达式2的if相结合。实际执行逻辑是:在表达式1为真的情况下,继续判断表达式2,若表达式2为真则执行语句块1,若表达式2为假则执行语句块2。可见与作者的意图相差太远。
要想实现作者意图,解决办法是合理使用“{}”,将上述表达式修改成如下形式即可。
if(表达式1)
{
if(表达式2)
语句块1;
}
else
语句块2;
3) 避免if/else语句后面加分号“;”
C语言中,分号“;”组成的语句称为空语句,它什么都不做,通常被用来做空循环体。如果不小心在if/else语句后面加了分号“;”,程序执行有可能违背了你的意图,导致意外结果。例如:
if(表达式);
语句块;
本来意图是表达式为真就执行语句块,现在不小心在if后面加了个分号“;”,则上述表达式实际上变成了如下形式:
if(表达式)
;
语句块;
也就是说如果表达式为真,则执行一个空语句。然后再执行语句块。此时上述语句块不再是在表达式为真的条件下执行,而是会无条件的执行。
可见,一个分号“;”误用会带来不可预计的后果。而且,此种错误在程序编译时是发现不了的,不会有任何错误提示。因此,建议大家编程时一定要细心。