一、流程控制概述
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:顺序结构,分支结构,循环结构。
1、顺序结构 程序从上到下逐条执行,中间没有任何判断和跳转。
2、分支结构 if-else switch-case
2.1if-else 根据条件,选择性地执行某段代码。
注意:
(1)条件表达式的值都是boolean类型
(2)如果各个条件表达式之间存在“交集”,一定要注意将范围小的条件写在范围大的条件上面,否则会出现死代码(范围小的条件就没机会执行了 参考Js流程控制)
2.2 switch-case
用于 简化if else中 多种情况下,等值(==)判断的情况 (注意是等值,大于,小于的还是乖乖写if else吧)
switch表达式的值=常量1/常量2/常量x.... 分别执行常量x对应的语句。
说明:switch表达式的值 只能是以下6种数据类型之一(规定):byte、short、int、char、String、枚举(没有浮点和布尔)
注意:当调用完当前case的执行语句以后,程序会继续向下执行其他case结构中的执行语句,直到遇到break关键字,或到此switch-case结构末尾为止。(建议都加break,养成好习惯)
default:可选,大备胎。如果谁都不匹配的时候,就执行default。而且default的位置很灵活,可放在switch代码块的任何位置。一般放在最后。注意如果default放在前面,就要特别注意是否加break
技巧:如果多个case的执行语句一模一样,则可以对相同语句的case进行合并
合并方法:只写最后一个case x的执行语句,加break。(前面的case空起,并且不加break)
exp:
int score=30;
switch(score/10){
case 0:
case 1:
case 2:
System.out.println("太菜了吧");break; //case0、1、2没有执行语句和break,自然都执行"太菜了",即完成合并
}
3、循环结构 while do...while for foreach
根据循环条件,重复性的执行某段代码。下图是循环结构的通用规则。
通用说明:
1、初始化部分只执行一次。就跟后面循环没关系了
2、循环条件部分的表达式值(用了关系运算符的表达式的值都是boolean类型)的数据类型必须是boolean类型(也可直接来个boolean类型的值),一旦循环条件直接用了boolean值(比如true),此时循环条件永远为真,即循环体永远执行,此时必须在循环体中使用break终止循环。
3、循环体部分同样可以使用break关键字,程序一旦读到break,会立刻跳出当个循环(如果嵌套了多个循环,一定要注意跳出的是哪一层循环)。
说明:循环体中可以使用if语句,一般break就用在if语句里面。
3.1 for 循环结构
按照前面循环结构体的通用规则,for循环体的语法如下。
语法: for(【初始化部分】;【循环条件】;【迭代部分】){ //三个部分都可以为空,for( ; ; ;) 此时相当于 while(true)
循环体部分;}
注意:
1、初始化部分,迭代部分可以有多条语句,但是必须用,(逗号)隔开。(用;编译器会失能)
2、初始化部分里面定义的变量,是属于for循环代码块的变量,即变量作用域在for循环内部,出了for循环,就没了。
3、for(; ; ;)三处都为空,相当于while(true)。即循环条件空相当于true。另外两个部分为空,其位置就转移到while循环的结构对应的位置。
3.2 while循环
按照前面循环体的通用规则,while循环体语法如下:
初始化部分; //在while代码块外面,说明他的作用域就不止while作用域了
while(循环条件){
循环体;
迭代部分; //千万不能写丢迭代部分,否则就成死循环(主要由于没语法错误,所以不写迭代部分,编译也会通过)
}
总结:for循环 和 while循环可以相互转换,用哪个,看心情了吧。
3.3 do...while 循环
按照前面循环体的通用规则,do...while循环体语法如下:
初始化部分; //初始化部分也在循环代码块外面,他的作用域也不止代码块中了
do { //和while的差异:不管循环条件结果是否为true,先执行一此代码块(包含循环体和迭代)
循环体;
迭代部分;
}while(循环条件);
说明:do...while循环至少会执行一次循环体。
4、扩展:嵌套循环 (一般不要嵌套超过3次)
概念:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环。
外层循环:此时,循环结构B即外层循环
内层循环:此时,循环结构A即内层循环
说明:
1、外层循环和内层循环是相对的,嵌套层数多的时候,循环体B可能又是另一个循环结构的内层循环。
So:假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了m*n次。
2、内层循环结构遍历一遍,只相当于外层循环体执行了一次
扩展: break 和 continue
1、默认情况:
关键字名 | 使用范围 | 作用 | 特别说明 |
break | switch-case | 跳出switch-case | |
循环结构 | 跳出当前循环结构 | 只是跳出当前循环结构,如果有嵌套循环,不会跳出上级循环结构。一般和循环体中的if联用 | |
continue | 循环结构 | 跳出当次循环 | 只是跳出当次,继续循环本循环结构的下次循环。一般和if联用 |
2、结束多层嵌套循环中的指定某一层循环
标签:可用标签标记指定循环,之后用break 和 continue 结束指定循环结构
语法:
标签名:for( ; ; ) { // 标签名可随意取,注意要符合标识符取名原则
for( ; ; ) {
break 标签名;} //通过内层循环中的break 结束了,指定标签名的外层循环。
}