第三章java基础学习——流程控制结构
3.1流程控制
3.1.1什么是流程控制?
- 在程序运行期间,会改变程序运行的顺序的指令
3.1.2流程控制分类
- 在编程语言中,程序在运行期间可以通过如下的流程进行控制:
- 顺序结构
- 分支结构
- 循环结构
i.顺序结构
- 程序自上而下依次执行。比如编写学习的main方法就是一个典型的顺序结构。
ii.分支结构
- 程序从两条或更多条路径中选择一条去执行
(1)if单分支结构
- 书写规范:
if(表达式){
执行语句;
}
- 用法案例:
public class Demo01{
public static void main(String[] args){
//声明两个变量比较大小打印输出大的数
//用随机数在范围[30-86]中产生两个数
int num1=(int)(Math.random()*57+30);
int num2=(int)(Math.random()*57+30);
//声明一个变量存放大的数
int max=num1>num2?num1:num2;
System.out.println("num1:"+num1+",num2:"+num2+",max:"+max);
if(num1>num2){
System.out.println("num1和num2而言,num1大,值是:"+num1);
}
System.out.println("num1和num2而言,num2大,值是:"+num2);
}
}
- 执行顺序:
- 先判定if中的表达式的值,如果表达式的值是true,则执行执行语句,整个if就执行结束了。如果后续还存在代码,则继续执行后续代码。
- 如果if中表达式的值是false,则跳过整个if单分支结构,继续之后后续代码。
- 注意事项
- if中的表达式一定是一个
boolean
值。 - if大括号中只存在一行代码时,可以不写大括号,但是不推荐。
- 对于单分支而言,罗列的情况是比较单一的。
- if中的表达式一定是一个
(2)if双分支结构
- 书写规范:
if(表达式){
执行语句1;
}else{
执行语句2;
}
- 用法案例:
public class Demo02{
public static void main(String[] args){
//声明两个变量比较大小打印输出大的数
//用随机数在范围[30-86]中产生两个数
int num1=(int)(Math.random()*57+30);
int num2=(int)(Math.random()*57+30);
//用if来判断两个数中最大值
if(num1>num2){
System.out.println("num1和num2而言,num1大,值是:"+num1);
}else{
System.out.println("num1和num2而言,num2大,值是:"+num2);
}
System.out.println("程序执行完毕");
}
}
- 执行顺序
- 先判定if中的表达式的值,如果表达式的值是true,则执行执行语句1,整个if就执行结束了。如果后续还存在代码,则继续执行后续代码。
- 如果if中表达式的值是false,则执行执行语句2,整个if-else执行结束,如果后续还存在代码,则继续执行后续代码。
- 注意事项
- if中的表达式一定是一个boolean值。
- if和else大括号中只存在一行代码时,可以不写大括号,但是不推荐。
- 对于双分支而言,罗列的情况是比较单一的。
(3)if多分支结构
- 书写规范:
if(表达式1){
执行语句1;
}else if(表达式2){
执行语句2;
}else if(表达式3){
执行语句3;
}elseif(表达式4){
执行语句4;
}...............{
执行语句n;
}else{
执行语句n+1;
}
- 用法案例:
//产生一个50-100之间的随机数,查看当前分数对应的等级
public class Demo03{
public static void main(String[] args){
//1:产生一个50-100之间的随机数
int score=(int)(Math.random()*51+50);
System.out.println(score);
//2:通过多分支进行判定
if(score==100){
System.out.println("天秀荣耀王者");
}else if(score<100&&score>=90){
System.out.println("优秀最强王者");
}else if(score<90&&score>=80){
System.out.println("蒂花之秀至尊星耀");
}else if(score<80&&score>=70){
System.out.println("地秀永恒砖石");
}else if(score<70&&score>=60){
System.out.println("你就是弟弟尊贵铂金");
}else{
System.out.println("倔强青铜");
}
System.out.println("远离游戏,珍爱生命");
}
}
- 执行顺序:
- 首先判定表达式1的值,如果表达式1的值是true,则执行对应的执行语句1;则整个if-else多分支全部执行结束,执行if多分支结构之后后续程序。
- 如果表达式1的结果是false,则判定表达式的2的值;如果表达式2的值是true’,则执行对应的执行语句2;以此类推…;如果上述所有的表达式都不满足条件,则直接执行else中的执行语句n+1,整个if-else多分支执行结束,执行if多分支结构之后后续程序。
- 注意事项:
- if多分支结构中if的表达式一定是一个boolean的值
- if和else if大括号中只存在一行代码时,可以不写大括号,但是不推荐。
- 建议在多分支中加入最后的一个else,用来将所有的分支、情况除外的情况都能够补充,罗列出基本上所有的情况。
(4)switch结构
- 书写规范:
switch(表达式){
case值1:
执行语句1;
break;
case值2:
执行语句2;
break;
case值3:
执行语句3;
break;
case值4:
执行语句4;
break;
case值5:
执行语句5;
break;
.
.
.
default:执行语句N;break;
}
- 用法案例:
/*一年四季,一年有12个月份针对不同的月份编写输出内容*/
public class Demo4{
public static void main(String[] rgs){
//1:用随机方法产生一个月份
int month=(int)(Math.random()*12+1);
System.out.println("月份是:"+month);
//2:通过switch进行判定
switch(month){
case12:
case1:
case2:
System.out.println("大约在冬季。。。。");
break;
case3:
case4:
case5:
System.out.println("小燕子穿花衣年年春天来这里");
break;
case6:
case7:
case8:
System.out.println("夏天夏天悄悄过去留下甜蜜蜜");
break;
case9:
case10:
case11:
System.out.println("就让秋风带走我的思念");
break;
default:
System.out.println("你丫家里有"+month+"月");break;
}
System.out.println("后续代码。。。。。");
}
}
- 执行顺序:
- 判断计算表达式的值
- 逐步匹配对应的case的值,如果存在对应的case得值,则执行case对应的执行语句;如果没有则继续向下寻找新的case,直到找到为止,再如果没有找到执行case的值,就执行default对应的执行语句;碰到指定的case的值之后,执行完对应的执行语句,那么整个switch则执行结束。如果之后还有程序,就执行之后程序。
- 注意事项:
- 注意case可以穿透,为了防止case穿透,在对应的执行语句后一定要加break;
- default的存在是用来加强整个switch的健壮性(尽量使得将所有情况都罗列出来)
- default语句可以存在当前switch中的任意位置,但是一般情况下放在整个switch的最后,否则可能引起程序的逻辑错误。
- switch而言表达式只能是byte、short、char、int类型,其它基本类型除了boolean类型之外可以通过强制转化进行书写。jdk1.5之后switch中增加了对于Enum(枚举)的支持,JDK1.7之后switch中增加了对于String(字符串)的支持
iii.循环结构
- 指在程序中需要反复执行某个功能而设置的一种程序结构
(1)while循环
- 书写规范:
while(循环表达式){
循环体;
}
- 用法案例:
public class Demo5{
public static void main(String[] args){
int num=1;
int sum=0;
while(num<=100){
sum=sum+num;
num++;
}
System.out.println("num="+num+",sum"+sum);
}
}
- 执行顺序:
- 判定循环表达式,如果表达式的结果是true,则执行循环体1次,继续判定循环表达式,直到循环表达式为false,整个while循环执行结束,
执行后续代码
- 判定循环表达式,如果表达式的结果是true,则执行循环体1次,继续判定循环表达式,直到循环表达式为false,整个while循环执行结束,
- 注意事项:
- 循环表达式是一个boolean值
- while循环是不确定循环次数,但是确定循环的终止条件
- while循环中的循环表达式目前而言。如果一直为true,那么导致当前循环为死循环,现阶段而言是没有意义的,所以应该避免。
(2)do-while循环
- 书写规范:
do{
循环体
}while(循环条件);
- 用法案例:
public class Demo6{
public static void main(String[] args){
int num=1;
int sum=0;
do{
sum=sum+num;
num++;
} while(num<=100);
System.out.println("num="+num+",sum"+sum);
}
}
- 执行顺序:
- 先执行do里面的循环体,再判定循环条件,如果循环条件为true,则继续执行循环体一次,直到条件不满足,不再进行循环,执行后续代码
- 循环条件为false,则跳过do-while循环
- 注意事项:
- do-while中的while中循环条件是一个boolean值
- do-while循环是不确定循环次数,但是确定循环的终止条件
- 对于do-while循环而言,首先要执行循环体一次,后判定是否要继续执行循环体,而while循环需要先判定然后再决定是是否执行循环体。例如:针对于英语4,6级考生考试而言,我们应该使用do-while循环。
(3)for循环
- 书写规范:
for(;;){
循环体;
}
for(声明循环变量;循环条件表达式;改变循环变量表达式){
循环体;
}
- 用法案例:
public class Demo7{
public static void main(String[] args){
int sum=0;
for(int num=1;num<=10;num++){
sum+=num;
}
System.out.println("num="+num+",sum"+sum);
}
}
- 执行顺序:
- 声明循环变量(只做一次)
- 判定循环表达式,如果表达式的结果是true,则执行循环体一次,执行改变循环变量的值;准备进行下一次循环,判定循环表达式,以此类推,直到表达式的结果是false,则结束整个for循环,for循环执行完毕之后,执行后续代码。
- 注意事项:
- 对于普通的for循环而言,循环变量外界是无法访问的。(后续讲解)
- 对于for循环而言,只要保证第一个是声明循环变量,对于循环变量的类型是没有要求的,可以是基本数据类型也可以是引用类型
总结三个循环之间的区别:
- for可以确定循环次数的
- while确定循环停止条件
- do-while先执行循环体一次
思考题:观察一下两个代码,哪个会报错?什么原因?
public class Demo8{
public static void main(String[] args){
int num=1;
int sum=0;
boolean flag=true;
while(flag){
sum=sum+num;
num++;
}
System.out.println("num="+num+",sum"+sum);
}
}
public class Demo9{
public static void main(String[] args){
int num=1;
int sum=0;
while(true){
sum=sum+num;
num++;
}
System.out.println("num="+num+",sum"+sum);
}
}
答:对于Demo9.java编译会报错,原因:对于flag的值,由于编译期间,编译只做语法和语义及格式检查,只有真正的运行时才会确定flag的值。