第三天:流程控制语句

一.概述

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。

二.顺序结构

代码:

public class ProcessControl{
    public static void main(String[] args){
        //顺序执行,根据编写的顺序,从上到下运行
        System.out.println(1);
        System.out.println(2);
        System.out.println(3);
    }
}

运行结果:


image.png

二.判断/选择结构

(一)判断语句—if

1.基本格式
if(关系表达式){
  语句体;
}
2.执行流程
  • 首先判断关系表达式看其结果是true还是false
  • 如果是true就执行语句体
  • 如果是false就不执行语句体
Untitled Diagram.jpg

代码:

public class ProcessControl{
    public static void main(String[] args){
        System.out.println("开始");
        // 定义两个变量
        int a = 10;
        int b = 20;
        int c = 10;
        
        //变量使用if判断
        if (a == b){
          System.out.println("a等于b");
        }
        if(a == c){
          System.out.println("a等于c");
        }
        System.out.println("结束");
    }
}

运行结果:


image.png

(二)判断语句—if...else

1.基本格式
if(关系表达式) {
  语句体1;
}else {
  语句体2;
}
2.执行流程
  • 首先判断关系表达式看其结果是true还是false
  • 如果是true就执行语句体1
  • 如果是false就执行语句体2
Untitled Diagram.jpg

代码:

public class ProcessControl{
    public static void main(String[] args){
    // 判断给定的数据是奇数还是偶数
    // 定义变量
    int a = 1;
    int b = 14;
    if(a % 2 == 0) {
        System.out.println("a是偶数");
    } else{
        System.out.println("a是奇数");
    }
    if(b % 2 == 0) {
        System.out.println("b是偶数");
    } else{
        System.out.println("b是奇数");
    }
    System.out.println("结束");
    }
}

运行结果:


image.png

(三)判断语句—if..else if...else

1.基本格式
if (判断条件1) {
  执行语句1;
} else if (判断条件2) {
  执行语句2;
}
...
}else if (判断条件n) {
  执行语句n;
} else {
  执行语句n+1;
}
2.执行流程
  • 首先判断关系表达式1看其结果是true还是false
  • 如果是true就执行语句体1
  • 如果是false就继续判断关系表达式2看其结果是true还是false
  • 如果是true就执行语句体2
  • 如果是false就继续判断关系表达式…看其结果是true还是false
  • 如果没有任何关系表达式为true,就执行语句体n+1。
image.png

代码:

public class ProcessControl{
    public static void main(String[] args) {
    // x和y的关系满足如下:
    // x>=3 y = 2x + 1;
    //‐1<=x<3 y = 2x;
    // x<=‐1 y = 2x – 1;
    // 根据给定的x的值,计算出y的值并输出。
    // 定义变量
    int x = 2;
    int y;
    if (x >= 3) {
        y = 2 * x + 1;
    } else if(-1 <= x && x<3) {
        y = 2 * x;
    } else {
        y = 2 * x - 1;
    }
    System.out.println("y的值是:"+y);
    }
}

运行结果:

image.png
3.用if..else if...else实现判断考试成绩

代码:

public class ProcessControl {
    public static void main(String[] args) {
        int score = 120;
        if (score >= 90 && score <= 100) {
            System.out.println("优秀");
        } else if (score >= 80 && score < 90) {
            System.out.println("好");
        } else if (score >= 70 && score < 80) {
            System.out.println("良");
        } else if (score >= 60 && score < 70) {
            System.out.println("及格");
        } else if (score >= 0 && score < 60) {
            System.out.println("不及格");
        } else {// 单独处理边界之外的不合理情况
            System.out.println("数据错误");
        }
    }
}

运行结果:

image.png
4.用if...else语句替换三元运算符

代码:

public class ProcessControl {
    public static void main(String[] args) {
        int a = 105;
        int b = 20;

        // 首先使用三元运算符
        // int max = a > b ? a : b;

        // 使用今天的if语句
        int max;
        if (a > b) {
            max = a;
        } else {
            max = b;
        }
        System.out.println("最大值:" + max);
    }
}

运行结果:

image.png

(四)选择语句—switch

1.基本格式
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
2.执行流程
  • 首先计算出表达式的值
  • 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
  • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
image.png

代码:

public class ProcessControl {
    public static void main(String[] args) {
        System.out.println("今天星期几?");
        // 定义变量,判断是星期几
        int weekday = 4;
        // switch语句实现选择
        switch (weekday) {
            case 1:
                System.out.println("星期一");
                break;
            case 2:
                System.out.println("星期二");
                break;
            case 3:
                System.out.println("星期三");
                break;
            case 4:
                System.out.println("星期四");
                break;
            case 5:
                System.out.println("星期五");
                break;
            case 6:
                System.out.println("星期六");
                break;
            case 7:
                System.out.println("星期日");
                break;
            default:
                System.out.println("你输入的数字有误!");
                break;
        }
    }
}

运行结果:

image.png

注意事项:

  • 多个case后面的数值不可以重复。
  • switch后面小括号当中只能是下列数据类型:
    基本数据类型: byte/short/char/int
    引用数据类型: String字符串、enum枚举
  • switch语句格式可以很灵活:前后顺序可以颠倒,而且break语句还可以省略。(匹配哪一个case就从哪一个位置向下执行,直到遇到了break或者整体结束为止。)
3. case的穿透性

代码:

public class ProcessControl {
    public static void main(String[] args) {
        int i = 5;
        switch (i) {
            case 0:
                System.out.println("执行case0");
                break;
            case 5:
                System.out.println("执行case5");
            case 10:
                System.out.println("执行case10");
            default:
                System.out.println("执行default");
        }
    }
}

运行结果:

image.png

注意事项:

  • 上述程序中,执行case5后,由于没有break语句,程序会一直向后走,不会在判断case,也不会理会break,直接运行完整体switch。

三.循环结构

(一)循环语句—for

1.基本格式
for(初始化表达式1; 布尔表达式2; 步进表达式4){
循环体3
}
2.执行流程

执行顺序:1234>234>234…2不满足为止。

  1. 负责完成循环变量初始化
  2. 负责判断是否满足循环条件,不满足则跳出循环
  3. 具体执行的语句
  4. 循环后,循环条件所涉及变量的变化情况
image.png

代码:

public class ProcessControl {
    public static void main(String[] args) {
        // 控制台输出10次HelloWorld,不使用循环
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("HelloWorld");
        System.out.println("-------------------");

        // 用for循环改进,循环10次
        // 定义变量从0开始,循环条件为<10
        for (int i = 1; i <= 10; i++) {
            System.out.println("HelloWorld" + i);
        }
    }
}

运行结果:

image.png

(二)循环语句2—while

1.基本格式
  • 标准格式:
while(布尔表达式2){
循环体3
}
  • 拓展格式:
初始化表达式1
while(布尔表达式2){
循环体3
步进表达式4
}
2.执行流程
  • 标准格式:执行顺序:23>23>23…2不满足为止。
  1. 负责判断是否满足循环条件,不满足则跳出循环
  2. 具体执行的语句
  • 拓展格式:执行顺序:1234>234>234…2不满足为止。
  1. 负责完成循环变量初始化
  2. 负责判断是否满足循环条件,不满足则跳出循环
  3. 具体执行的语句
  4. 循环后,循环条件所涉及变量的变化情况
image.png

代码:

public class ProcessControl {
    public static void main(String[] args) {
        // 控制台输出10次HelloWorld,使用while循环
        int i = 1;
        while (i <= 10) {
            System.out.println("HelloWorld" + i);
            i++;
        }
    }
}

运行结果:

image.png

(三)循环语句2—do...while

1.基本格式
  • 标准格式:
do{
循环体3
}while(布尔表达式2);
  • 拓展格式:
初始化表达式1
do{
循环体3
步进表达式4
}while(布尔表达式2);

执行流程

2.执行流程
  • 标准格式:执行顺序:32>32>32…2不满足为止。
  1. 负责判断是否满足循环条件,不满足则跳出循环
  2. 具体执行的语句
  • 拓展格式:执行顺序:134>234>234…2不满足为止。
  1. 负责完成循环变量初始化。
  2. 负责判断是否满足循环条件,不满足则跳出循环。
  3. 具体执行的语句
  4. 循环后,循环变量的变化情况
image.png

代码:

public class ProcessControl {
    public static void main(String[] args) {
        // 控制台输出10次HelloWorld,使用do...while循环
        int i = 1;
        do {
            System.out.println("HelloWorld" + i);
            i++;
        } while (i <= 10);
    }
}

运行结果:

image.png

注意事项:

  • do...while循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。

代码:

public class ProcessControl {
    public static void main(String[] args) {
        do {
            System.out.println("无条件执行一次!");
        } while (false);
    }
}

运行结果:

image.png

for 和 while 的小区别:

  • 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
  • 在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while。

(四)跳出语句

1.break

使用场景:终止switch或者循环

  • 在选择结构switch语句中
  • 在循环语句中

代码:

public class ProcessControl {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            // 需求:打印完两次HelloWorld之后结束循环
            if (i == 3) {
                break;
            }
            System.out.println("HelloWorld" + i);
        }
    }
}

运行结果:

image.png
2.continue

使用场景:结束本次循环,继续下一次的循环

  • 在循环语句中

代码:

public class ProcessControl {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            // 需求:不打印第三次HelloWorld
            if (i == 3) {
                continue;
            }
            System.out.println("HelloWorld" + i);
        }
    }
}

运行结果:

image.png

(五)死循环

死循环:也就是循环中的条件永远为true,死循环的是永不结束的循环。

1.死循环的标准格式
while(true){
循环体
}

代码:

public class ProcessControl {
    public static void main(String[] args) {
        while (true) {
            System.out.println("Hello!");
        }
    }
}

运行结果:

image.png
  • 死循环后边不能有语句,否则编译失败

代码:

public class ProcessControl {
    public static void main(String[] args) {
        while (true) {
            System.out.println("Hello!");
        }
        System.out.println("Hello!");
    }
}

运行结果:

image.png

(六)嵌套循环

所谓嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。
总共的循环次数=外循环次数*内循环次数

1.嵌套循环格式:
for(初始化表达式1; 循环条件2; 步进表达式7) {
for(初始化表达式3; 循环条件4; 步进表达式6) {
执行语句5;
}
}
2.执行顺序:
  • 123456>456...456>723456>456...456>723456
  • 外循环一次,内循环多次。
    代码:
public class ProcessControl {
    public static void main(String[] args) {
        // 需求:使用嵌套循环,打印5*8的矩形
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 8; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

运行结果:

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容