目录

写在前面

一、程序的三种基本结构

二、顺序结构:最朴素的执行方式

三、分支结构:让代码学会选择

3.1 if语句:最常用的分支利器

3.2 代码风格:大括号应该放哪里?

3.3 两个常见的坑

3.4 switch语句:多路选择的另一种方案

四、循环结构:让代码学会重复

4.1 while循环:先判断,后执行

4.2 break:提前跳出循环

4.3 continue:跳过本次循环

4.4 for循环:最常用的循环结构

4.5 do-while循环:先执行,后判断

五、综合练习:动手写一个猜数字游戏

总结


写在前面

经过前三篇文章的学习,我们已经掌握了Java的基本数据类型、变量和运算符。但到目前为止,我们写的程序都是"直线"执行的——从上到下,一行接一行,没有任何分支和转折。

这就好比一台只会走直线的机器人,遇到岔路口不会拐弯,碰到重复劳动也不会偷懒。显然,真正的程序要比这灵活得多。

今天这篇文章,我们来学习Java中的程序逻辑控制——让代码能够做出判断、选择路径、重复执行。这是编程从"玩具"走向"工具"的关键一步。


一、程序的三种基本结构

任何复杂的程序,归根结底都由三种基本结构组成:

  1. 顺序结构:代码按书写顺序逐行执行

  2. 分支结构:根据条件决定执行哪段代码

  3. 循环结构:重复执行某段代码直到条件不满足

这三种结构可以组合出任意复杂的程序逻辑。我们先从最简单的顺序结构说起。


二、顺序结构:最朴素的执行方式

顺序结构是最直观的执行方式——代码从上往下,一行一行地执行。

System.out.println("第一行");
System.out.println("第二行");
System.out.println("第三行");

如果你调整代码的顺序,输出结果也会随之改变。这一点看似简单,但却是理解程序执行的基础。


三、分支结构:让代码学会选择

3.1 if语句:最常用的分支利器

if语句有三种语法格式,适用于不同场景。

格式一:单一判断

if (布尔表达式) {
    // 条件为true时执行的代码
}

int score = 95;
if (score >= 90) {
    System.out.println("奖励一个鸡腿!");
}

格式二:二选一

if (布尔表达式) {
    // 条件为true时执行
} else {
    // 条件为false时执行
}

int score = 85;
if (score >= 90) {
    System.out.println("奖励一个大鸡腿!");
} else {
    System.out.println("奖励一个大嘴巴子...");
}

格式三:多分支判断

if (布尔表达式1) {
    // 表达式1为true时执行
} else if (布尔表达式2) {
    // 表达式2为true时执行
} else {
    // 都不满足时执行
}

来看一个实际例子:根据分数评定等级。

int score = 85;
if (score >= 90) {
    System.out.println("优秀");
} else if (score >= 80) {
    System.out.println("良好");
} else if (score >= 70) {
    System.out.println("中等");
} else if (score >= 60) {
    System.out.println("及格");
} else if (score >= 0) {
    System.out.println("不及格");
} else {
    System.out.println("错误数据");
}

这里有个细节值得注意:由于if-else if是按顺序判断的,我们不需要在每个条件中都写上score < 90这样的上限判断——因为能走到第二个分支,说明前面的条件已经不成立了。

3.2 代码风格:大括号应该放哪里?

// 推荐风格
if (x == 10) {
    // 语句
} else {
    // 语句
}

// 另一种合法但不推荐的风格
if (x == 10)
{
    // 语句
}
else
{
    // 语句
}

Java社区普遍推荐第一种风格——左大括号跟在条件表达式后面。这样代码更紧凑,阅读起来也更流畅。

3.3 两个常见的坑

陷阱一:多写分号

int x = 10;
if (x == 10); {   // 注意这里多了一个分号
    System.out.println("hello");
}

这个分号成了if语句的"身体"(空语句),而后面的大括号里的代码变成了独立代码块,无论如何都会执行。

陷阱二:悬垂else

int x = 10;
int y = 10;
if (x == 10)
    if (y == 10)
        System.out.println("aaa");
else
    System.out.println("bbb");

这里的else到底和哪个if配对?答案是:else与最近的if匹配。所以上面代码等价于:

if (x == 10) {
    if (y == 10) {
        System.out.println("aaa");
    } else {
        System.out.println("bbb");
    }
}

为了避免这种歧义,强烈建议始终加上大括号。

3.4 switch语句:多路选择的另一种方案

当需要根据一个变量的多个取值分别执行不同逻辑时,switch语句也是一种选择。

int day = 3;
switch (day) {
    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;
}

使用switch的几个要点:

  1. break不能省略:否则会发生"穿透"现象——匹配到一个case后,会继续执行后续所有case的代码,直到遇到break为止。

  2. 表达式类型有限制:只能是byte、char、short、int、String、枚举类型。不能是long、float、double

  3. case值不能重复

  4. 无法表达复杂条件:比如num > 10 && num < 20这种范围判断,switch无能为力。

  5. 不建议嵌套使用:switch套switch会让代码难以阅读和维护。

总的来说,switch的使用场景比较有限。能用if解决的问题,尽量用if解决。


四、循环结构:让代码学会重复

计算机最擅长的事情之一就是"重复"。循环结构让我们可以用几行代码完成成千上万次的重复操作。

4.1 while循环:先判断,后执行

while (循环条件) {
    // 循环体
}

示例1:打印1到10

int num = 1;
while (num <= 10) {
    System.out.println(num);
    num++;
}

示例2:计算1到100的和

int n = 1;
int sum = 0;
while (n <= 100) {
    sum += n;
    n++;
}
System.out.println(sum);  // 5050

示例3:计算5的阶乘

int n = 1;
int result = 1;
while (n <= 5) {
    result *= n;
    n++;
}
System.out.println(result);  // 120

示例4:计算1! + 2! + 3! + 4! + 5!

int num = 1;
int sum = 0;
while (num <= 5) {
    int factorResult = 1;
    int tmp = 1;
    while (tmp <= num) {
        factorResult *= tmp;
        tmp++;
    }
    sum += factorResult;
    num++;
}
System.out.println(sum);

这里出现了嵌套循环——循环里面套循环。外层循环控制阶乘的求和,内层循环计算每个数的阶乘。随着嵌套层次增加,代码复杂度也会显著上升。

4.2 break:提前跳出循环

break的作用是立即结束当前循环,不管循环条件是否还满足。

// 找出100到200之间第一个3的倍数
int num = 100;
while (num <= 200) {
    if (num % 3 == 0) {
        System.out.println("找到了:" + num);
        break;
    }
    num++;
}

执行到break时,循环立刻终止,程序继续执行循环后面的代码。

4.3 continue:跳过本次循环

continue的作用是跳过本次循环的剩余代码,直接进入下一次循环的条件判断。

// 打印100到200之间所有3的倍数
int num = 100;
while (num <= 200) {
    if (num % 3 != 0) {
        num++;
        continue;
    }
    System.out.println("找到了3的倍数:" + num);
    num++;
}

当执行到continue时,本次循环中continue之后的代码不再执行,直接回到循环条件判断处。

4.4 for循环:最常用的循环结构

for循环将循环的三个要素——初始化、条件判断、变量更新——集中在一行,结构更加清晰。

for (表达式1; 布尔表达式2; 表达式3) {
    // 循环体
}

示例1:打印1到10

for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}

示例2:计算1到100的和

int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
System.out.println(sum);  // 5050

示例3:计算5的阶乘

int result = 1;
for (int i = 1; i <= 5; i++) {
    result *= i;
}
System.out.println(result);  // 120

示例4:计算1! + 2! + ... + 5!

int sum = 0;
for (int i = 1; i <= 5; i++) {
    int tmp = 1;
    for (int j = 1; j <= i; j++) {
        tmp *= j;
    }
    sum += tmp;
}
System.out.println(sum);

使用for循环的注意事项:

  • 表达式2(循环条件)如果缺失,循环会成为死循环

  • 同样不建议在for后面多加一个分号

  • break和continue在for循环中的行为与while一致

4.5 do-while循环:先执行,后判断

do {
    // 循环体
} while (循环条件);

do-while的特点是:至少执行一次循环体,然后再判断是否继续。

int num = 1;
do {
    System.out.println(num);
    num++;
} while (num <= 10);

在实际开发中,do-while的使用频率远低于for和while,了解即可。


五、综合练习:动手写一个猜数字游戏

学了这么多理论知识,不妨动手实践一下。下面是一个简单的猜数字游戏,综合运用了我们今天学的知识点。

import java.util.Random;
import java.util.Scanner;

public class GuessNumber {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner scanner = new Scanner(System.in);
        
        // 生成1到100之间的随机数
        int target = random.nextInt(100) + 1;
        int guessCount = 0;
        
        System.out.println("欢迎来到猜数字游戏!");
        System.out.println("我已经想好了一个1到100之间的数字,请猜猜看吧。");
        
        while (true) {
            System.out.print("请输入你的猜测:");
            int guess = scanner.nextInt();
            guessCount++;
            
            if (guess < target) {
                System.out.println("猜小了,再大一点!");
            } else if (guess > target) {
                System.out.println("猜大了,再小一点!");
            } else {
                System.out.println("恭喜你,猜对了!");
                System.out.println("你一共猜了" + guessCount + "次。");
                break;
            }
        }
        
        scanner.close();
    }
}

这个程序用到了我们之前学的变量、运算符,以及今天学的if分支、while循环、break跳转。你能读懂每一行代码的含义吗?


总结

今天我们学习了Java程序逻辑控制的三大结构:

  1. 顺序结构:代码按顺序逐行执行

  2. 分支结构:if-else if-else实现多路选择,switch适用于有限选项的匹配

  3. 循环结构:while、for(最常用)、do-while(了解即可)

还学会了两个重要的控制语句:

  • break:立即结束循环

  • continue:跳过本次循环剩余代码

下一篇文章,我们将学习Java中的方法(函数)——如何把重复的代码封装起来,实现"一次编写,多次调用"。敬请期待!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐