控制结构
在程序中,程序运行的流程控制决定程序是如何执行的,控制结构主要有三大流程控制语句
顺序控制
程序从上到下逐行执行,中间没有任何判断和跳转,顺序控制是程序默认的控制语句
分支控制
if else
分支
分支控制是让程序有选择(根据判断进行选择)的执行,分支控制有三种形式:
单分支
基本语法:
javaif(条件表达式) { 执行代码块; }
当条件表达式为
true
时,就会执行{}
的代码,如果{}
中只有一条语句,可以不使用{}
进行包裹双分支
基本语法:
javaif(条件表达式) { 执行代码块1; } else { 执行代码块2; }
当条件表达式为
true
时,执行代码块1,否则执行代码块2多分支
基本语法:
javaif(条件表达式1) { 执行代码块1; } else if(条件表达式2) { 执行代码块2; } ... else { 执行代码块n; }
当对应的表达式为
true
时,执行对应的代码块,如果条件表达式都不成立,则执行代码块n多分支可以没有
else
,如果所有的条件表达式都不成立,则一个执行入口都没有
嵌套分支:在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支结构称为内层分支,外面的分支结构称为外层分支,但是建议分支不要超过3层,因为可读性不好
基本语法:
if(条件表达式1) {
if(条件表达式2) {
执行代码块2;
}
else {
执行代码块3;
}
}
switch
分支
基本语法:
switch(表达式) {
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
default:
default语句块;
break;
}
如果表达式的结果和
case
常量1匹配,就执行语句块1,如果没有匹配,就继续和case
常量2进行匹配,以此类推,如果一个都没有匹配上,执行default
语句块
break
表示退出switch
语句如果执行完一个
case
语句块后,没有执行break
语句,那么不会退出switch
语句,会继续进行后面case
的语句块,不需要进行匹配,会直接穿透执行,同时,如果前面没有break
的话还会执行default
的语句块对于
default
匹配项,有没有break
是无所谓的,执行了default
语句块都会退出switch
语句
注意细节:
表达式的数据类型,应该和
case
后面的常量类型一致,或者是可以自动转换成可以相互比较的类型(如输入的是字符,而常量是int
)switch
(表达式)中表达式的返回值必须是javadouble c = 1.1; switch(c) { // 报错double类型不能使用 case 1.1: ... }
case
句子中的值必须是常量(具体的值),或者是计算表达式(得到的也是常量),不能是变量default
句子是可选的,当没有匹配的case
时,执行default
break
语句用来执行完一个case
分支后使程序跳出seitch
语句块,如果没有写break
,程序会顺序执行到switch
结尾
if
和switch
使用的选择
- 如果判断的具体数值不多,而且符合(
byte
、short
、int
、char
、enum
、String
)这六种类型,建议使用switch
语句 - 其他情况,对区间判断,对结果为
boolean
类型判断,使用if
语句,if
语句的使用范围更广
循环控制
循环控制就是让代码可以循环的执行
for
循环
基本语法:
for(循环变量初始化;循环条件;循环变量迭代) {
循环操作(语句);
}
如果循环条件为
true
,就会执行一次循环操作
注意事项:
循环条件是返回一个布尔值的表达式
for(;循环条件;)
中的初始化和变量迭代可以其它地方,但是两边的分号不能省略javaint i = 1; for(;i <= 10;) { 循环操作(语句); i++; }
循环的初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
javaint count = 3; for(int i = 0, j = 0; i < count; i++, j += 2) { System.out.println(i, j); // 0,0 1,2 2,4 }
编程思想:化繁为简(将复杂的需求先拆分一个个简单的需求,逐步完成),先死后活(先考虑固定的值,再转成可以灵活变化的值)
while
循环
基本语法:
循环变量初始化;
while(循环条件) {
循环体(语句);
循环变量迭代;
}
注意事项:
- 循环条件是返回一个布尔值的表达式
while
循环是先判断,再执行语句
do..while
循环
基本语法:
循环变量初始化;
do {
循环体(语句);
循环变量迭代;
}while(循环条件);
注意事项:
do..while
循环是先执行,再判断,也就是说至少会执行一次
多重循环控制
将一个循环放在另一个循环体内,就形成了嵌套循环,一般建议使用两层即可,最多不要超过三层,否则代码可读性大大降低
实际上,嵌套循环就是把内层循环当外层循环的循环体,当只有内存循环的循环条件为false
时,才会完全跳出内层循环,才可以结束外层的当次循环,开始外层的下一次循环
设置外层循环次数为m
次,内层循环为n
次,则内层循环体一共执行m*n
次
// 打印空心金字塔
public class HollowPyramids {
public static void main(String[] args) {
int totalLevel = 5;
for(int i = 1; i <= totalLevel; i++) {
for(int k = 1; k <= totalLevel - i; k++) {
System.out.print(" ");
}
for(int j = 1; j <= 2 * i - 1; j++) {
if (j == 1 || j == 2 * i - 1 || i == totalLevel) {
System.out.print("*");
}
else {
System.out.print(" ");
}
}
System.out.println(" ");
}
}
}
System.out.print("*");
表示输出后不换行
System.out.println("*");
表示输出后换行
break
关键字
在循环语句的流程控制中,我们可以使用break
语句来终止某个语句块的执行
基本语法:
{
...
break;
}
执行到
break
时跳出整个循环,用于提前终止循环javafor(int i = 0; i < 10; i++) { if(i == 3) { break; } System.out.print(i); } // 结果输出 012
break
语句出现在多层嵌套语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ......
label2: { ......
label3: { ......
break label2;
......
}
}
}
break
语句可以指定退出到哪层
label1
是标签,名称由程序员指定,break
后指定到哪个label
,就退出到哪里如果没有指定
break
,则默认退出最近的循环体在实际开发中,尽量不要使用标签,会导致可读性变差
continue
关键字
continue
语句用于结束本次循环,继续执行下一次循环
基本语法:
{
...
continue;
// 执行了continue语句,本次循环后面的内容就不执行了
}
如果continue
语句出现在多层嵌套的循环语句体中,可以通过标签指明要跳出哪一层循环
return
关键字
return
通常与方法函数一起使用,表示跳出所在的方法,如果return
写在main
方法中,会退出主程序