在前几篇博客中主要是以笔者遇到的一些典型的题目为例子而展开的讨论,接下来几篇将是以知识点的结构进行讲述。本文主要是讲述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总结的更多相关文章

  1. Java基础四(switch、数组、)

    1.流程控制语句switch2.数组3.随机点名器案例 ###01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. ...

  2. Java基础学习笔记五 Java基础语法之面向对象

    面向对象 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式.面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...

  3. 8.Java基础_if-else和switch选择语句

    /* 选择语句(基本与C++相同) if-else语句: 格式一: if(关系式){ 语句体; } 格式二: if(关系式){ 语句体; } else{ 语句体; } 格式三: if(关系式){ 语句 ...

  4. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  5. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  6. 大数据学习--day04(选择结构、循环结构、大数据java基础面试题)

    选择结构.循环结构.大数据java基础面试题 switch: 注意: byte short int char String(jdk1.7支持) 不能是 long float double boolea ...

  7. java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别

    java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...

  8. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  9. Java基础五(方法)

    今日内容介绍1.方法基础知识2.方法高级内容3.方法案例 ###01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. ###02方法的定义格 ...

  10. JAVA基础——Switch条件语句

    JAVA基础——switch 条件语句 switch语句结构: switch(表达式){ case值1: 语句体1: break: case值2: 语句体2: break: case值3: 语句体3: ...

随机推荐

  1. grep与find

    grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出.grep全称是Global Regular Expression Print -c:只输出匹配行的计数.-I:不区分大小写(只适 ...

  2. 一个例子深入理解ClassLoader

    文件类加载器,该加载器重载了loadClass方法,逻辑是只读取文件来加载类,不委托给父类加载器进行加载 package com.ydd.study.hello.classloader; import ...

  3. div滑入与滑出

    html <div class="pop_tit"> <span class="p_tit1" title="大连未来城LECITY ...

  4. 读写ZIP&JAR文件

    1. ZipEntry 是包括目录的,也就是目录也被当做是一个单独的Entry,在列出它下面的文件之前先列出这个directory entry. 这个在解压ZIP文件的的时候特别有用,我们要先创建这个 ...

  5. form表单类标签汇总

    <form action="form_action.asp" method="get"> First name: <input type=&q ...

  6. iOS:使用Github托管自己本地的项目代码方式三(命令行方式: Terminal Line)

    使用终端命令行将本地项目代码上传到github上进行托管 对于IOS开发者来说,Github的使用是必须要掌握的一种技能,而把项目由本地上传到Github有多种方式 1.开发工具Xcode配置Git, ...

  7. Facial Detection and Recognition with opencv on ios

    https://www.objc.io/issues/21-camera-and-photos/face-recognition-with-opencv/

  8. 重写NSLog,Debug模式下打印日志和当前行数

    在pch文件中加入以下命令,NSLog在真机测试中就不会打印了 //重写NSLog,Debug模式下打印日志和当前行数 #if DEBUG #define NSLog(FORMAT, ...) fpr ...

  9. 利用Xstream注解生成和解析xml

    实体类: @XStreamAlias("person") public class PersonBean {     @XStreamAlias("firstName&q ...

  10. wpf 面试题目

    初级工程师 解释什么是依赖属性,它和以前的属性有什么不同?为什么在WPF会使用它?什么是样式什么是模板绑定(Binding )的基础用法解释这几个类的作用及关系: Visual, UIElement, ...