五、Java基础---------if else、switch总结
在前几篇博客中主要是以笔者遇到的一些典型的题目为例子而展开的讨论,接下来几篇将是以知识点的结构进行讲述。本文主要是讲述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...
}
...个或者多个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类型作为匹配条件。
五、Java基础---------if else、switch总结的更多相关文章
- Java基础四(switch、数组、)
1.流程控制语句switch2.数组3.随机点名器案例 ###01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. ...
- Java基础学习笔记五 Java基础语法之面向对象
面向对象 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式.面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...
- 8.Java基础_if-else和switch选择语句
/* 选择语句(基本与C++相同) if-else语句: 格式一: if(关系式){ 语句体; } 格式二: if(关系式){ 语句体; } else{ 语句体; } 格式三: if(关系式){ 语句 ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- Java基础知识陷阱系列
Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...
- 大数据学习--day04(选择结构、循环结构、大数据java基础面试题)
选择结构.循环结构.大数据java基础面试题 switch: 注意: byte short int char String(jdk1.7支持) 不能是 long float double boolea ...
- java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别
java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- Java基础五(方法)
今日内容介绍1.方法基础知识2.方法高级内容3.方法案例 ###01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. ###02方法的定义格 ...
- JAVA基础——Switch条件语句
JAVA基础——switch 条件语句 switch语句结构: switch(表达式){ case值1: 语句体1: break: case值2: 语句体2: break: case值3: 语句体3: ...
随机推荐
- nccmp - 比较netcdf的文件内容 - 编译安装
1. 简介 Compares two NetCDF files in-place to find specific variables, dimensions and/or attributes th ...
- Introduction to Project Management(I)
Project management in the modern sense began in the early 1950s, although it has its roots further b ...
- JS-007-富文本域操作
在日常 web 编写过程中,富文本域几乎成为了一个网站不可页面元素,同时,其也有着各种各样的实现方式,网络上也存在着各种各样的集成插件可供引用.此文以 js 获取.修改 163 邮箱写邮件时的邮件内容 ...
- echarts -01 入门
1.效果图 2. code <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 被druid折磨的够呛
使用德鲁伊数据库连接池 数据源是这么配的 <!--数据源--> <bean id="dataSource" class="com.alibaba.dru ...
- Interview with BOA
1. BFS 2. QuickSort 3. PCA, 1000 articles, so many factors, how to reduce factors. 4. newton's metho ...
- Introduction to Face Detection and Face Recognition
http://www.shervinemami.info/faceRecognition.html http://docs.opencv.org/2.4/modules/contrib/doc/fac ...
- Android java取得当前日期增加一天或多天
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstanc ...
- [Linux]gdb调试
exbot@ubuntu:~/CodeLearn/HelloWorld/src$ g++ -g main.cpp exbot@ubuntu:~/CodeLearn/HelloWorld/src$ ./ ...
- Oracle表名、列名、约束名的长度限制
Oracle数据库版本11.2.0.1.0 Oracle表名.列名.约束名的长度限制 1.查询用户所有的表 select * from USER_TABLES; 2.查询用户所有表的列 select ...