<Java> 4 程序控制结构
本文最后更新于:2023年11月24日 上午
程序运行的流程控制决定程序是如何执行的,是我们必须掌握的。主要分为:顺序控制、分支控制、循环控制。
4.1 顺序控制
程序从上到下逐行执行,中间没有任何判断和跳转(默认的控制顺序)
比如:Java 定义变量时采用合法的前向引用。
语句:Java 中最小的执行单位。语句分为 单语句 和 复合语句。
单语句:通常意义的一条语句。语句间以分号
;
分隔。复合语句:一对大括号括起来的语句组。也称为 “块”
1
2
3
4
5{
语句1;
语句2;
...
}块中可以有多条语句。块后没有分号
;
4.2 分支控制 if-else
让程序有选择的执行。主要分为:单分支控制、双分支控制
4.2.1 单分支控制
1 |
|
特别地,把代码块(复合语句)作为语句的场合也能这样写:
1 |
|
当条件表达式为 ture
,就会执行
{执行代码块;}
;如果为 false
则不执行。特别地:如果 {执行代码块;}
中只有一条代码,也可以不写 { }
(但还是建议写上)
1 |
|
4.2.2 双分支控制
1 |
|
当条件表达式为 ture
,就会执行
{执行代码块1;}
;如果为 false
则执行
{执行代码块2;}
。
1 |
|
4.2.3 多分支控制
1 |
|
特别地:多分支可以没有
else
。此时如果条件都不成立,则无执行入口
4.2.4 嵌套分支
在一个分支结构中又完整嵌套了另一个完整的分支结构。里面的分支称为内层分支,外面的分支称为外层分支。
Java 规定,else 子句属于逻辑上距其最近,且没有匹配 else 的 if 语句
规范:嵌套尽量不超过 3 层(可读性不好)
4.3 switch
分支结构
1 |
|
switch
关键字,表示 switch 分支。表达式
对应一个值。该值必须是 int 或 char(char 可以转化为 int)。是 byte 或 short 的场合,要提升为 int。不允许 long、double 或 floatcase 常量1;
表示:当表达式
的值等于常量1
,则执行语句块1
。break;
表示退出 switch 分支。- 当
表达式
的值匹配常量1
,则执行语句块1
,如果不匹配,则继续匹配常量2
,以此类推。 - 如果全都不匹配,则执行
default
。 - 如果不写
break;
,则会发生穿透,即不进行判断而继续执行下一语句块。
1 |
|
4.3.1 使用细节
- 表达式数据类型,应和
case
后的常量类型一致,或者是可以自动转换成可以比较的类型。如:输入的是char
而 常量是int
- switch 中
表达式
的返回值必须是:(byte, short, int, char,enum[枚举] ,String
) case
语句中的值必须是常量或常量表达式,不能是变量。default
是可选的。没有就不执行。break;
用来跳出 switch 分支。如果不写,会持续执行语句,直到分支结束或遇到下一个break;
4.3.2 与 if-else
分支结构的取舍
- 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。
- 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广
4.4 for
循环控制
1 |
|
for
关键字,表示循环控制四个要素:1. 循环变量初始化 2. 循环的条件 3. 循环的操作 4. 循环变量迭代
循环操作可以有多条语句
如果循环操作只有一条语句,可以省略
{}
,但建议不省略
4.4.1 使用细节
- 循环条件是返回一个 boolean 值(
ture
或false
)的公式。 for(;循环条件;){ }
其中的初始化和变量迭代可以写在别处,但;
不能省略。如果不写在别处,那个循环变量初始化中声明的变量只能在该 for 循环中使用。- 控制台用 ctrl + c 强制结束一个流程
- 循环初始值可以有多条初始化语句,但要求类型一样,并用
,
隔开。变量迭代也可以有多条代码,用,
隔开。
1 |
|
4.4.2 化繁为简 先死后活
1 |
|
4.5 while
循环控制
1 |
|
while
也有四要素,只是位置和 for
不同
4.5.1 使用细节
- 循环条件是返回一个 boolean 值(
ture
或false
)的公式。while 循环中,循环条件不能为空。 while
循环是先判断再执行语句。
4.6 do..while
循环控制
1 |
|
do..while
是关键字- 也有四要素,位置不同
- 先执行,再判断。也就是说,一定会至少执行一次
- 最后有一个
;
while
与do..while
区别:“要账”do..while
先打一顿
4.6.1 使用细节
- 循环条件是返回一个 boolean 值(
ture
或false
)的公式。 do..while
循环是先执行再判断的语句。因此至少执行一次。
4.7 多重循环控制
- 将一个循环放在另一个循环体内,就形成了嵌套循环。建议一般使用两层,最多不超过三层。
- 嵌套循环是把内层循环当成外层循环的循环体。只有内层
false
时才结束当层循环。 - 若内层执行 n 次,外层 m 次,则合计会循环 n*m 次
4.7.1 空心金字塔问题
1 |
|
4.7.2 九九乘法表问题
1 |
|
4.8 跳转控制语句
跳转控制语句用于分支或循环中,以便程序员更好控制程序执行方向
4.8.1 break
用于中止一个语句块的执行
语法:break;
break 可以被用在三种场合中
switch 语句中,以跳出判断(结束穿透)
for、while、do…while 循环语句中,以跳出循环
语句块中,以跳过本块中所有剩余语句
break
语句出现在多层嵌套的语句块中时,可以通过 标签 指明要终止的时哪一层语句块。1
2
3
4
5
6
7
8a:{
b: {
c: {
...
berak b;
}
}
}JAVAa:
b:
c:
是标签,名字由程序员指定break
后指定哪个标签就退出到哪里- 实际开发中,尽量不要使用标签
4.8.3 continue
在循环中出现。用于结束本次循环,继续下一次循环
语法:continue;
进行下次循环前,仍会判断循环条件是否满足
在多层嵌套循环中,可以通过标签指出跳出哪次循环(同
break
)
4.8.4 return
用于方法。表示跳出所在的方法
语法:return;
方法有返回值的场合,将返回值写在 return
后:return 值;
后面会再讲~