首页 > 编程语言 >Java顺序结构和分支结构

Java顺序结构和分支结构

时间:2022-10-29 23:11:37浏览次数:76  
标签:语句 case 顺序 Java 代码 else switch 执行 结构

Java顺序结构和分支结构

1.* 顺序结构

任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下逐行地执行,中间没有任何判断和跳转。

如果main方法的多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代码先执行,排在后面的代码后执行。这意味着:如果没有流程控制,Java方法里的语句是一个顺序执行流,从上向下依次执行每条语句。

1.* 分支结构

Java提供了两种常见的分支控制结构:if语句和switch语句,其中if语句使用布尔表达式或布尔值作为分支条件来进行分支控制;而switch语句则用于对多个整型值进行匹配,从而实现分支控制。

1.*.& if条件语句

if语句使用布尔表达式或布尔值作为分支条件来进行分支控制。if语句有如下三种形式:

第一种形式:

点击查看代码
if (logic expression) {
    statement...
}

第二种形式:

点击查看代码
if (logic expression) {
    statement...
} else {
    statement...
}

第三种形式:

点击查看代码
if (logic expression) {
    statement...
} else if (logic expression) {
    //可以有零个或多个else if语句
    statement...
} else {
    //最后的else语句也可以省略
    statement...
}

在上面if语句的三种形式中,放在if之后括号里的只能是一个逻辑表达式,即这个表达式的返回值只能是true或false。第二种形式和第三种形式是相通的,如果第三种形式中else if块不出现,就变成了第二种形式。

在上面的条件语句中,if (logic expression)、else if (logic expression)和else后花括号括起来的多行代码被称为代码块,一个代码块通常被当成一个整体来执行(除非运行过程中遇到return、break、continue等关键字,或者遇到了异常),因此这个代码块也被称为条件执行体。

查看代码

如果if (logic expression)、else if (logic expression)和else后的代码块只有一行语句时,则可以省略花括号,因为单行语句本身就是一个整体,无须用花括号来把它们定义成一个整体。下面代码完全可以正常执行:

点击查看代码
//定义变量a,并为其赋值
int a = 5;
if (a > 4)
    //如果a > 4,则执行下面的执行体,只有一行代码作为代码块
    System.out.println("a大于4");
else
    //否则,执行下面的执行体,只有一行代码作为代码块
    System.out.println("a不大于4");

通常,我们建议不要省略if、else、else if后执行体的花括号,即使条件执行体只有一行代码,也保留花括号会有更好的可读性,而且保留花括号会减少发生错误的可能。例如如下代码,则不能正常执行:

点击查看代码
//定义变量b,并为其赋值
int b = 5;
if (b > 4)
    //如果b > 4,则执行下面的执行体,只有一行代码作为代码块
    System.out.println("b大于4");
else
    //否则,执行下面的执行体,只有一行代码作为代码块
    b--;
    //对于下面代码而言,它已经不再是条件执行体的一部分,因此总会执行
    System.out.println("b不大于4");

System.out.println("b不大于4")总会执行,因为这行代码并不属于else后的条件执行体,else后的条件执行体就是b--这行代码。

注意:if、else、else if后的条件执行体要么是一个花括号括起来的代码块,则这个代码块整体作为条件执行体;要么是以分号为结束符的一行语句,甚至可能是一个空语句(空语句是一个分号),那么就只是这条语句作为条件执行体。

如果if后有多条语句作为条件执行体,若省略了这个条件执行体的花括号,则会引起编译错误。看下面代码:

点击查看代码
//定义变量c,并为其赋值
int c = 5;
if (c > 4)
    //如果c > 4,则执行下面的执行体,将只有c--一行代码为执行体
    c--;
    //下面是一行普通代码,不属于执行体
    System.out.println("c大于4");
//此处的else将没有if语句,因此编译出错
else
    //否则,执行下面的执行体,只有一行代码作为代码块
    System.out.println("c不大于4");

在上面代码中,因为if后的条件执行体省略了花括号,则系统只把c--作为条件执行体,当c--语句结束后,if语句也就结束了。后面的System.out.println("c大于4")代码已经是一行普通代码了,不再属于条件执行体,从而导致else语句没有if语句,从而引起编译错误。

对于if语句,还有一个很容易出现的逻辑错误,这个逻辑错误并不属于语法问题,但引起错误的可能性更大。看下面程序:

查看代码

表面上看起来,上面的程序没有任何问题:人的年龄大于20岁是青年人,年龄大于40岁是中年人,年龄大于60岁是老年人。但运行上面程序,发现打印结果是:青年人,而实际上我们希望45岁应判断为中年人——这显然出现了一个问题。

对于任何的if else语句,表面上看起来else后没有任何条件,或者else if后只有一个条件——但这不是真相:因为else的含义是“否则”——else本身就是一个条件!这也是笔者把if、else后代码块统称为条件执行体的原因,else的隐含条件是对前面条件取反。因此,上面代码实际上可改写为:

查看代码

此时就比较容易看出为什么发生上面的错误了。对于“age > 40 && !(age > 20)”这个条件,又可改写成“age > 40 && age <=20”条件,这样永远也不会发生了。对于“age> 60 && !(age > 20) && !(age > 40 && !(age> 20))”这个条件,则更不可能发生了。因此,程序永远都不会判断中年人和老年人的情形。

为了达到正确的目的,我们把程序改写成如下形式:

查看代码

运行程序,得到了正确结果。实际上,上面程序等同于下面代码:

查看代码

上面程序的判断逻辑即转为如下三种情形:

  • age大于60岁,判断为“老年人”
  • age大于40岁,且age小于等于60岁,判断为“中年人”
  • age大于20岁,且age小于等于40岁,判断为“青年人”

上面的判断逻辑才是我们实际希望的判断逻辑。因此,当使用if...else语句进行流程控制时,一定不要忽略了else所带的隐含条件。

如果每次都去计算if条件和else条件的交集也是一件非常烦琐的事情,为了避免出现上面的错误,在使用if...else语句时有一条基本规则:总是优先把包含范围小的条件放在前面处理。如age > 60和age > 20两个条件,明显age > 60的范围更小,所以应该先处理age > 60的情况。

注意:使用if...else语句时,一定要先处理包含范围更小的情况。

1.*.& Java 7的switch分支语句

1.*.&.% 基本语法介绍

switch语句由一个控制表达式和多个case标签组成,和if语句不同的是,switch语句后面的控制表达式的数据类型只能是byte、short、char、int四个整数类型和枚举类型,不能是boolean类型。Java 7改进了switch分支语句,Java 7允许switch语句中的控制表达式为java.lang.String类型。

switch语句往往需要在case标签后紧跟一个代码块,case标签作为这个代码块的标识。switch语句的语法格式如下:

点击查看代码
switch (expression) {
    case condition1: {
        statement(s)
        break;
    }
    case condition2: {
        statement(s)
        break;
    }
    ...
    case conditionN: {
        statement(s)
        break;
    }
    default: {
        statement(s)
    }
}

这种分支语句的执行是先对expression求值,然后依次匹配condition1、condition2、...、conditionN等值,遇到匹配的值即执行对应的执行体;如果所有case标签后的值都不与expression表达式的值相等,则执行default标签后的代码块。

和if语句不同的是,switch语句中各case标签后代码块的开始点和结束点非常清晰,因此完全可以省略case后代码块的花括号。与if语句中的else类似,switch语句中的default标签看似没有条件,其实是有条件的,条件就是expression表达式的值不能与前面任何一个case标签后的值相等。

下面程序示范了switch语句的用法:

查看代码

运行上面程序,看到输出“中”,这个结果完全正常,字符表达式score的值为'C',对应结果为“中”。在case标签后的每个代码块后都有一条break语句,这个break语句有极其重要的意义,Java的switch语句允许case后代码块没有break语句,但这种做法可能引入一个陷阱。如果把上面程序中的break语句都注释掉,将看到如下运行结果:

点击查看代码
中
及格
不及格
成绩输入错误

这个运行结果看起来比较奇怪,但这正是由switch语句的运行流程决定的:switch语句会先求出expression表达式的值,然后拿这个表达式和case标签后的值进行比较,一旦遇到相等的值,程序就开始执行这个case标签后的代码,不再判断与后面case、default标签的条件是否匹配,除非遇到break才会结束。

Java 11编译器做了一些改进,如果开发者忘记了case块后面的break语句,Java 11编译器会生成警告:“[fallthrough]可能无法实现case”。这个警告以前需要为javac指定-X: fallthrough选项才能显示出来。

Java 7增强了switch语句的功能,允许switch语句的控制表达式是java.lang.String类型的变量或表达式——只能是java.lang.String类型,不能是StringBuffer或StringBuilder这两种字符串类型。

例如,如下程序也是正确的:

查看代码

注意:使用switch语句时,有两个值得注意的地方:第一个地方是switch语句后的expression表达式的数据类型只能是byte、short、char、int四个整数类型和枚举类型;第二个地方是如果省略了case后代码块的break将引入一个陷阱。

1.*.&.% 相同功能case语句合并

如果某几个case实现了同样的功能,那么可以将case语句合并如下:

查看代码

标签:语句,case,顺序,Java,代码,else,switch,执行,结构
From: https://www.cnblogs.com/hzhiping/p/16840148.html

相关文章

  • JAVA-考勤查询
    packagecom.itheima;importjavax.swing.*;publicclassJFrame09{publicstaticvoidmain(String[]args){JFramejf=newJFrame();jf.s......
  • java8 stream按某个字段分组,允许分组字段是null
    Map<String,List<Dto>>deviceMap=deviceList.stream().collect(Collectors.groupingBy(Dto::getFlowId));场景:如果getFlowId是null.就会包以下错误elementcannotb......
  • 【笔记07】Javascript - 基本概念 - (作用域)
    【笔记07】Javascript-基本概念-(作用域)functiontest(){}通常,我们把函数生成的空间叫做“作用域”,但这么说不精准。作用域属于函数,函数产生了作用域。一切为对象的东西,......
  • JAVA-猜数字游戏GUI
    packagecom.itheima;importjavax.swing.*;publicclassJFrame07{publicstaticvoidmain(String[]args){JFramejf=newJFrame();jf.s......
  • JAVA-聊天室
    packagecom.itheima;importjavax.swing.*;publicclassJFrame06{publicstaticvoidmain(String[]args){JFramejf=newJFrame();jf.s......
  • java 方法
    java中的函数必须放在类中。void和return不能同时存在java中,方法名可以相同,但是当方法名相同的时候,方法的参数不能一样。这属于方法的重复当方法的名字一样,参数不一样......
  • java01
    ~~有出错的地方,我会及时改正owo~~java入门jdk配置&&dos指令程序是有序指令集合(cpu)95年有了java第一个版本java技术体系平台:javaSEjavaEEjavaME//ME不怎......
  • 实验一 Java基础与结构化编程
     一、实验目的1.熟悉JDK开发环境。2.掌握JavaApplication的程序结构和开发过程。3.掌握Java语言基础。4.掌握分支语句。5.掌握循环语句。二、实验内容问题描述 掌握JavaApplic......
  • Java重点 | 面向对象
    面向对象面向对象概述面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一......
  • C语言学习--结构体套结构体
    #include<stdio.h>#include<stdlib.h>structstu{intid;intage;charname[128];};/*structheima_stu{intid;intage;charn......