在前几篇博客中主要是以笔者遇到的一些典型的题目为例子而展开的讨论,接下来几篇将是以知识点的结构进行讲述。本文主要是讲述if ()else 、if() else if()、switch() case 的一些注意细节。
一、if else结构
if语句使用表达式或者boolean值作为分支条件进行分支控制。If语句有如下三种形式。
第一种形式
if(logic expression)
{
stattement...
}
第二种形式
if(logic expression)
{
stattement...
}
else
{
stattement...
}
第三种形式
if(logic expression)
{
stattement...
}
else if(logic expression)
{
stattement...
}
...//后面可以跟0个或者多个else if语句
else //最后一个else也可以省略
{
stattement...
}
在上面三种形式中if语句之后的括号只能是一个逻辑表达式,即这个表达式的返回值只能说true或者false。第二种形式和第三种是相通的,如果第三种形式不出现else if()就变成了第二种形式。
因为if 与else是一个整体,所以在if 与else之间不能有其他多余的语句,例如下面的形式
int a=0;
if(a==0)
{
a=1;
}
int c=a;//报错
else
{
a=2;
}
如果if else语句后面只有一条语句那么可以省略大括号,如下面的形式:
int a=0;
if(a==0)
a=1;//只有一条语句所以省略花括号
else//后面有多条语句,所以花括号不可以省略
{
a=2;
System.out.print(a);
}
在使用if语句时还有一个很容易犯的逻辑错误,但是这个逻辑使用不属于语法错误。如下程序展示:
int age = 45;
if (age > 20)
{
System.out.println("青年人");
}
else if (age > 40)
{
System.out.println("中年人");
}
else if (age > 60)
{
System.out.println("老年人");
}
表面上看起来,上面的程序没有任何问题:人的年龄大于20岁的是年轻人,年龄大于40岁的是中年人,大于60的是老年人。但是运行上面的程序,发现打印的结果是:年轻人,实际上我们希望45岁应该判断为中年人—显然出现了一个问题。
对于任何的if else语句,表面上看起来else后面没有任何条件,或者else if后面只有一个条件—但是这不是真相:因为else隐含的语义是"否则",也就是else本身就是一个条件!else隐含的意识是与前面的条件取反。因此上面的代码实际上可以修改为:
int age = 45;
if (age > 20)
{
System.out.println("青年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 40 && !(age > 20))
{
System.out.println("中年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 60 && !(age > 20) && !(age > 40 && !(age > 20)))
{
System.out.println("老年人");
}
此时就比较容易看出为什么发生上面的错误了。对于age > 40 && !(age > 20)又可以改写为age > 40 &&age<=20,这样永远也不会发生。对于age > 60 && !(age > 20) && !(age > 40 && !(age > 20))更不可能发生了,因此程序永远都不会判断中年人和老年人的情况。为了达到正确的目的,我们把程序改写为以下的形式:
int age = 45;
if (age > 60)
{
System.out.println("老年人");
}
else if (age > 40)
{
System.out.println("中年人");
}
else if (age > 20)
{
System.out.println("青年人");
}
运行程序得到正确结果。实际上上面的程序等同于下面的代码:
int age = 45;
if (age > 60)
{
System.out.println("老年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 40 && !(age >60))
{
System.out.println("中年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 20 && !(age > 60) && !(age > 40 && !(age >60)))
{
System.out.println("青年人");
}
上面程序的判断逻辑即转化为如下的三种形式:
age 大于60 判断为老年人
age 大于40且小于60 判断为中年人
age 大于20且小于40 判断为青年人
上面的判断逻辑才是我们所希望的,因此当使用if else 语句进流程控制时,一定不要忽略lelse 所隐含的条件。
如果每次都去计算if条件和else条件的交集也是意见繁琐的事因此引入了switch case结构。
二、switch case结构
正如上节所提及的,当if else语句过多时,处理起来会相当繁琐,而switch case的出现弥补了这一缺陷。
switch 语句由一个控制表达式和多个case标签组成,和if语句不同的是,switch语句后面的控制表达式的数据类型只能是byte、short、char、int四个数据类型和枚举类型,不能是boolean类型(注意的是再jdk 1.7中新增了String类型)。
switch 语句case标签后面紧跟一个代码块,case标签作为这个代码块的表示,语法格式如下
switch(expression)
{
case condition1: statement(s);break;
case condition2: statement(s);break;
case condition3: statement(s);break;
case condition4: statement(s);break;
...
default:statement(s);
}
执行原则是判断 expression 与case中条件进行匹配,当匹配成功则执行当前标签内容,如全部匹配失败则执行default代码块。示例如下:
char score = 'C';
//执行swicth分支语句
switch (score)
{
case 'A':
System.out.println("优秀.");
break;
case 'B':
System.out.println("良好.");
break;
case 'C':
System.out.println("中");
break;
case 'D':
System.out.println("及格");
break;
case 'F':
System.out.println("不及格");
break;
default:
System.out.println("成绩输入错误");
}
运行上面的程序,看到输出"中",这个结果完全正确,字符表达式score的值为'C',对应结果为'中'。在case标签后的每个代码块后面都一个break语句,其作用是当匹配成功后执行完业务逻辑后终止switch。如果将break语句注释,会造成一个很严重的错误。错误输出为:
中
及格
不及格
成绩输入错误
这个运行结果看起来很难去理解,其实正是switch流程结构所决定的。Switch语句会先求出express表达式的值,然后那这个表达式和case标签进行比较,一旦遇到相等的值程序就开始执行case标签之后的代码而不再去匹配后面的case,除非遇到break才会结束。
到这里if else 、switch知识点总结完毕,另外补充两点
1、处理if else 时尽量先处理范围更小的情况
2、在jdk1.7 中 switch 运行使用String类型作为匹配条件。