基本介绍

在程序中,程序运行的流程控制决定程序如何执行

总体分类

  1. 顺序控制
  2. 分支控制
  3. 循环控制

顺序控制

概念

顺序控制是指从上到下逐行地执行,中间没有任何判断和跳转

细节

变量必须先定义再使用,即遵循顺序控制

java定义变量时采用合法的前向引用

1
2
3
4
5
6
7
// 正确
int num1 = 12;
int num2 = num1 + 2;

// 错误
int num2 = num1 + 2; // 变量必须先定义后使用
int num1 = 12;

分支控制

单分支if

1
2
3
if (条件表达式) {
代码块; // 当条件表达式为true时执行代码块的内容
}

双分支if-else

1
2
3
4
5
if (条件表达式) {
代码块1; // 当条件表达式为true时执行代码块1
} else {
代码块2; // 当条件表达式为false时执行代码块2
}

多分支else-if

1
2
3
4
5
6
7
8
9
10
if (条件表达式1) {
代码块1; // 当条件表达式1为true时执行代码块1
} else if (条件表达式2)) {
代码块2; // 当条件表达式2为true时执行代码块2
} else if (条件表达式3){
代码块3; // 当条件表达式3为true时执行代码块3
} else {
代码块4; // 其他情况执行代码块4;
}
// 注:else-if分支可以有很多个,都遵循以上规则

switch

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch(表达式) { // 表达式等于对应的常量值时,执行对应的代码块
case 常量1:
代码块1
break; // break语句:直接跳出switch语句,如果没有
// break,会依次执行下面的case语句中的代码块,
// 直到执行break或者已经执行完所有的case语句,
// 退出switch
case 常量1:
代码块1
break;
……
case 常量n:
代码块n;
break;
default: // 没有表达式对应的常量值时,就执行default代码块
代码块;
break;
}

流程图

img

细节

  1. 表达式的返回值应该是一个常量(byte、shoirt、int、char、enum、String等常量),且表达式和常量之间应该满足自动类型转换规则

  2. switch穿透:没有break语句会执行下一个case语句中的代码块

    break语句用来执行完一个case分支后使程序跳出switch语句块,如果没有写上break,程序会顺序执行到switch结尾

  3. default语句可选,没有defalut语句时相当于下面的语句

    1
    2
    default:
    break;

嵌套分支

顾名思义,嵌套分支就是在一个分支结构里又嵌套了另外一个完整的分支结构,里面的分支结构称为内层分支、内层分支外面的分支结构称为外层分支

注:嵌套分支结构内外层分支可以是任何一种分支结构,且内外层是相对而言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (条件表达式1) { // else-if分支 外层分支
if (条件表达式2) { // if分支 内层分支
代码块1;
}
} else if (条件表达式3) { // else-if分支 外层分支
if (条件表达式4) { // if-else分支 内层分支
代码块2;
} else { // if-else分支 内层分支
代码块3;
}
} else { // else-if分支 外层分支
switch() { // switch分支 内层分支
case 常量值1:
代码块4;
break;
……
default:
代码块5;
break;
}
}

循环控制

基本概念

可以让程序循环执行的控制语句

for

基本语法

1
2
3
for (循环变量初始化; 循环条件; 循环变量迭代) {
循环代码块;
}

流程图

for

执行过程

  1. 循环变量初始化,赋予循环变量初值
  2. 判断循环条件是否成立,如果成立,执行for循环体中的代码块,循环变量迭代,再次判断循环条件是否成立
  3. 重复1、2步,直到循环条件不成立,退出循环

细节

  1. 循环条件是返回一个boolean值的表达式
  2. for(循环变量初始化; 循环条件; 循环变量迭代)中的初始化和变量迭代可以写到其他地方(或省略),但是两边的分号不能省略
  3. 循环初始值可以有多条初始化语句,但要求初始化语句之间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,迭代语句之间也要求用逗号隔开

while

基本语法

1
2
3
4
while (循环条件) {
循环代码块;
循环变量迭代;
}

流程图

img

执行过程

  1. 先判断循环条件是否成立,如果成立,进入循环体,执行循环体语句
  2. 执行完毕循环体语句后,再次判断循环条件是否成立,如果成立,则重复第2步,直到循环条件不成立,退出while循环

细节

  1. 循环条件是一个返回布尔值的表达式

  2. while循环时先判断再执行语句

do-while

基本语法

1
2
3
4
do {
循环体语句;
循环变量迭代;
} while(循环条件);

流程图

img

执行过程

  1. 先执行循环体语句,执行完毕后再判断循环条件是否成立,如果成立,则继续执行循环体语句
  2. 重复1,直到循环体语句不成立,退出循环

细节

  1. 与while语句不同,do-while先执行循环体语句,再判断循环条件
  2. do-while语句最后有一个分号;

多重循环

介绍

多重循环也叫循环嵌套,是将一个循环放在另外一个循环体内的复合语句,for、while、do-while都可以作为外层循环和内层循环

代码示意

1
2
3
4
5
6
7
8
9
for (循环变量初始化; 循环条件; 循环变量迭代) {
while (循环条件) {
do {
循环体语句;
循环变量迭代;
} while(循环条件);
}
……
}

细节

  1. 多重循环就是把内层循环当成外层循环的循环体,只有内层循环的循环条件为false时,才会完全跳出内层循环,这时进入下一次外层循环
  2. 理论上多重循环可以嵌套无数层,但是一般建议使用两层,最多不要超过三层,否则代码的可读性很差

break和continue

break

介绍

break语句用于终止某个语句块的执行,一般用在switch语句或者循环控制(for、while、do-while)语句中

基本语法

1
2
3
4
5
6
// 假定该括号在switch、for、while、do-while中
{
……
break; // break后的语句不再执行,直接跳出
……
}

continue

介绍

continue可用于循环语句(for、while、for-while)的循环体中,用于终止本次循环,直接进行下一次循环

基本语法

1
2
3
4
5
6
// 假定该括号for、while、do-while中
{
……
continue; // continue后的语句不再执行,直接进入下一次循环
……
}

label标签

基本介绍

label标签可以给循环做标签标记,这样break可以指定跳出哪层循环、continue可以指定直接执行下一次哪层循环

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
label1: // 标签1
for (循环变量初始化; 循环条件; 循环变量迭代) { // 循环1
label2: // 标签2
for(循环变量初始化; 循环条件; 循环变量迭代) { // 循环2
label3:
for (循环变量初始化; 循环条件; 循环变量迭代) { // 循环3
循环体语句;
// 这里假设break和continue只会执行其中一个
break label1; // 直接跳出循环1
continue label2; // 直接进入循环2的下一次循环
}
}
}

细节

  1. 假如break和continue没有指定标签,则默认作用于最近的循环体
  2. 标签名不一定非要是label1、label2……,名称可自定义
  3. 应尽量少使用标签,因为破坏了顺序控制结构和可读性

return

介绍

return使用在方法中,表示退出所在的方法

基本语法

1
2
3
4
5
6
// 假设为方法的括号
{
……
return; // 直接退出方法
……
}

细节

  1. 如果return写在main方法中,表示退出整个程序
  2. return后面可以有返回值,但返回的实际内容应该与方法声明的返回值类型匹配或者可以进行自动类型转换
  3. 若方法的返回值类型声明为void,则可以不写返回值、甚至可以省略return,省略return的作用效果等价于return在方法体的最后一行