在程序中,程序运行的流程控制决定程序是如何运行的。主要有三大流程控制语句(顺序控制、分支控制、循环控制)
程序从上到下逐行执行,中间没有任何判断和跳转。
public class Test{int num1 = 12; // 先运行这行int num2 = num1 + 2; // 再运行这行
}
单分支: 当条件表达式为 ture 时,就会执行 {} 中的代码,为 false ,则不执行。如果{}中只有一条语句,则不用{}。
if(条件表达式){执行代码块;(一条或多条语句)
}
双分支: 当条件表达式成立,即执行代码块1,否则执行代码块2。
if(条件表达式){执行代码块1;(一条或多条语句)
}
else{执行代码块2;(一条或多条语句)
}
多分支: 当条件表达式1成立时,执行代码块1,如果表达式1不成立,才去判断表达式2是否成立,如果表达式2成立,就执行代码块2,以此类推,如果所有的表达式都不成立,则执行else的代码块。注意:只能有一个执行入口;多分支可以没有else。
if(条件表达式1){执行代码块1;(一条或多条语句)
}
else if(条件表达式2){执行代码块2;(一条或多条语句)
}
...
else{执行代码块n;(一条或多条语句)
}
嵌套分支: 在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支结构称为内层分支,外面的分支结构称为外层结构。嵌套最好不要超过3层,因为会影响可读性。
if(){if(){// if-else...}else{// if-else...}
}
语法格式:
switch(表达式){case 常量1: // 语句块1;break;case 常量1: // 语句块1;break;...case 常量n: // 语句块n;break;default:// 语句块;break;
}
上述格式说明: switch关键字表示switch分支;表达式对应一个值;case常量1:当表达式的值等于常量1,就执行语句块1;break:表示退出switch;如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配case常量2,以此类推,如果一个都没有匹配上,就执行default中的语句块。
switch注意事项及细节:
1:表达式数据类型,应与case后的常量一致,或者是可以自动转成可以互相比较的类型
2:switch中表达式的返回值必须是:byte,short,int,char,enum,String
3:case子句中的值必须是常量或常量表达式,而不能是变量
4:default子句是可选的,当没有匹配的case时,执行default
5:break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break,程序会顺序执行到switch结尾,除非遇到break;
switch与if的选择:
1:如果判断的具体数值不多,而且符合switch表达式的返回值数据类型,则建议使用switch语句。(等值判断)
2:如果是对区间判断,对结果为boolean类型判断,则使用if,if的使用范围更广。(区间/等值判断)
语法格式:
for(循环变量初始化;循环条件;循环变量迭代){循环操作(一条或多条语句);
}
上述格式说明: for关键字表示循环控制。for有四要素:循环变量初始化、循环条件、循环变量迭代、循环操作。如果循环操作只有一条语句,则可以省略{}。
注意事项及细节:
1:循环条件是返回一个布尔值的表达式。
2:for(;循环判断条件;)
中的变量初始化和变量迭代可以写到其它地方,但是两边的分号不能省略,for(;;){}
表示的是无限循环。
3:循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开;变量迭代语句也可以有多条,中间用逗号隔开。
语法格式:
循环变量初始化;
while(循环条件){循环操作;循环变量迭代;
}
注意事项及细节: while循环也有四要素,只是放的位置和for不一样。循环条件是返回一个布尔值的表达式,while循环是先判断再执行语句。
语法格式:
循环变量初始化;
do{循环操作;循环变量迭代;
}while(循环条件);
注: do while是关键字,它也有循环四要素,只是位置不一样;先执行,再判断,也就是说,至少会执行一次;要以分号结尾。
介绍:
1:将一个循环放在另一个循环体内,就形成了嵌套循环,最好不要嵌套超过3层,会影响可读性。
2:实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
3:设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
示例:
// 输出一个空心等腰三角形
int totalLevel = 10; // 该变量控制行数
for(int a = 1;a <= totalLevel;a++){for(int b = totalLevel;b > a;b--){System.out.print(" "); }for(int c = 1;c <= (2*a-1);c++){if(c == 1 || c == (2*a-1) || a == totalLevel){System.out.print("*"); }else{System.out.print(" "); }}System.out.println("");
}
break: 用于终止某个语句块的执行,一般使用在switch或者循环中。
{...break; ...
}
注意事项和细节: break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1:{
label2: {
label3: {...break label2;...}}}
// 1. break语句可以指定退出哪层
// 2. label1是标签,名字由程序员指定,break指定到哪个label就退出到哪里
// 3. 在实际开发中,尽量不要使用标签
// 4. 如果没有指定break,默认退出最近的循环体
continue: 用于结束本次循环,继续执行下一次循环。
{...continue;...
}
注意事项和细节: continue语句出现在多层嵌套的语句块中时,可以通过标签指明要跳过的是哪一层循环,与前面的标签的使用规则一样。
return: 使用在方法内,表示跳出所在的方法,使用在main方法内,则退出程序。
{...return;...
}