第三章 流程控制语句

发布时间 2023-06-04 18:30:52作者: 爱敲代码的小北

image

1. 顺序结构

顺序结构就是程序从上到下​ 运行的 ,表达式语句都是顺序执行的 。

并且上一行对某个变量的修改对下一行会产生影响

image

2. 分支语句

2.1 if-else 条件判断结构

基本语法 :

结构 1:单分支条件判断:if

格式:

if(条件表达式){
    语句块;
}

说明:​ 条件表达式必须是布尔表达式(关系表达式或逻辑表达式)或 布尔变量。

执行流程:

  1. 首先判断条件表达式看其结果是 true 还是 false
  2. 如果是 true 就执行语句块
  3. 如果是 false 就不执行语句块

image

结构 2:双分支条件判断:if...else

格式:

if(条件表达式) {
    语句块1;
}else {
    语句块2;
}

执行流程:

  1. 首先判断条件表达式看其结果是 true 还是 false
  2. 如果是 true 就执行语句块 1
  3. 如果是 false 就执行语句块 2

image

结构 3:多分支条件判断:if...else if...else

格式:

if (条件表达式1) {
    语句块1;
} else if (条件表达式2) {
    语句块2;
}
...
}else if (条件表达式n) {
    语句块n;
} else {
    语句块n+1;
}

说明:​ 一旦条件表达式为 true,则进入执行相应的语句块。执行完对应的语句块之后,就跳出当前结构。

执行流程:

  1. 首先判断关系表达式 1 看其结果是 true 还是 false
  2. 如果是 true 就执行语句块 1,然后结束当前多分支
  3. 如果是 false 就继续判断关系表达式 2 看其结果是 true 还是 false
  4. 如果是 true 就执行语句块 2,然后结束当前多分支
  5. 如果是 false 就继续判断关系表达式…看其结果是 true 还是 false

n. 如果没有任何关系表达式为 true,就执行语句块 n+1,然后结束当前多分支

image

2.2 switch-case 选择结构

基本语法 :

语法格式:

switch(表达式){
    case 常量值1:
        语句块1;
        //break;
    case 常量值2:
        语句块2;
        //break;
    // ...
   [default:
        语句块n+1;
        break;
   ]
}

执行流程图:

image

执行过程:

第 1 步:根据 switch 中表达式的值,依次匹配各个 case。如果表达式的值等于某个 case 中的常量值,则执行对应 case 中的执行语句。

第 2 步:执行完此 case 的执行语句以后

** 情况 1:如果遇到 break,则执行 break 并跳出当前的 switch-case 结构**

​**情况2:如果没有遇到break,则会继续执行当前case之后的其它case中的执行语句。--->case穿透**

...

**直到遇到break关键字或执行完所有的case及default的执行语句,跳出当前的switch-case结构**

使用注意点:

  • switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0);
  • case 子句中的值必须是常量,不能是变量名或不确定的表达式值或范围;
  • 同一个 switch 语句,所有 case 子句中的常量值互不相同;
  • break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果没有 break,程序会顺序执行到 switch 结尾;
  • default 子句是可选的。同时,位置也是灵活的。当没有匹配的 case 时,执行 default 语句。

case 的穿透性:

  • 在 switch 语句中,如果 case 的后面不写 break,将出现穿透现象,也就是一旦匹配成功,不会在判断下一个 case 的值,直接向后运行,直到遇到 break 或者整个 switch 语句结束,执行终止。

2.3 if-else 语句与 switch-case 语句比较

  • 结论:凡是使用 switch-case 的结构都可以转换为 if-else 结构。反之,不成立。

  • 开发经验:如果既可以使用 switch-case,又可以使用 if-else,建议使用 switch-case。因为效率稍高。

  • 细节对比:

    • if-else 语句优势

      • if 语句的条件是一个布尔类型值,if 条件表达式为 true 则进入分支,可以用于范围的判断,也可以用于等值的判断,使用范围更广​。
      • switch 语句的条件是一个常量值(byte,short,int,char,枚举,String),只能判断某个变量或表达式的结果是否等于某个常量值,使用场景较狭窄​。
    • switch 语句优势

      • 当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用 if 和 switch 都可以,习惯上使用 switch 更多。因为效率稍高​。当条件是区间范围的判断时,只能使用 if 语句。
      • 使用 switch 可以利用穿透性​,同时执行多个分支,而 if...else 没有穿透性。

3. 循环语句

  • 理解:循环语句具有在某些条件​ 满足的情况下,反复执行​ 特定代码的功能。

  • 循环结构分类:

    • for 循环
    • while 循环
    • do-while 循环
  • 循环结构四要素​:

    • 初始化部分
    • 循环条件部分
    • 循环体部分
    • 迭代部分

4. 关键字 break 和 continue

            适用范围            在循环结构中使用的作用                     相同点

break       switch-case
            循环结构            一旦执行,就结束(或跳出)当前循环结构         此关键字的后面,不能声明语句

continue    循环结构            一旦执行,就结束(或跳出)当次循环结构         此关键字的后面,不能声明语句

此外,很多语言都有 goto 语句,goto 语句可以随意将控制转移到程序中的任意一条语句上,然后执行它,但使程序容易出错。Java 中的 break 和 continue 是不同于 goto 的。

5. Scanner : 键盘输入功能的实现

  • 如何从键盘获取不同类型(基本数据类型、String 类型)的变量:使用 Scanner 类。

  • 键盘输入代码的四个步骤:

    1. 导包:import java.util.Scanner;
    2. 创建 Scanner 类型的对象:Scanner scan = new Scanner(System.in);
    3. 调用 Scanner 类的相关方法(next() / nextXxx()​),来获取指定类型的变量
    4. 释放资源:scan.close();
  • 注意:需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常 导致程序终止。

6. 如何获取一个随机数

如何产生一个指定范围的随机整数?

1、Math 类的 random()的调用,会返回一个[0,1)范围的一个 double 型值

2、Math.random() * 100 ---> [0,100)

**(int)(Math.random() * 100)---> [0,99]**

​ (int)(Math.random() * 100) + 5 ----> [5,104]

3、如何获取[a,b]​ 范围内的随机整数呢?(int)(Math.random() * (b - a + 1)) + a

4、举例

class MathRandomTest {
    public static void main(String[] args) {
        double value = Math.random();
        System.out.println(value);

        //[1,6]
        int number = (int)(Math.random() * 6) + 1; //
        System.out.println(number);
    }
}