Java基础---逻辑控制(上)

一、顺序结构

顺序结构比较简单,像我们之前写过的代码就是顺序结构的, 按照代码书写的顺序一行一行执行。

System.out.println("aaa");

System.out.println("bbb");

System.out.println("ccc");

// 运行结果

aaa

bbb

ccc

如果调整代码的书写顺序, 则执行顺序也发生变化

System.out.println("aaa");

System.out.println("ccc");

System.out.println("bbb");

// 运行结果

aaa

ccc

bbb

二、分支结构

2.1 if 语句

基本语法形式1

if(布尔表达式){

//条件满足时执行代码

}

基本语法形式2

if(布尔表达式){

//条件满足时执行代码

}else{

//条件不满足时执行代码

}

基本语法形式3 多分支的情况

if(布尔表达式){

//条件满足时执行代码

}else if(布尔表达式){

//条件满足时执行代码

}else{

//条件都不满足时执行代码

}

代码示例1: 判定一个数字是奇数还是偶数

int num = 10;

if (num % 2 == 0) {

System.out.println("num 是偶数");

} else {

System.out.println("num 是奇数");

}

代码示例2: 判定一个数字是正数还是负数

int num = 10;

if (num > 0) {

System.out.println("num 是正数");

} else if (num < 0) {

System.out.println("num 是负数");

} else {

System.out.println("num 是 0");

}

代码示例3: 判定某一年份是否是闰年

复制代码
 int year = 2000;
        if (year % 100 == 0) {
// 判定世纪闰年
            if (year % 400 == 0) {
                System.out.println("是闰年");
            }
            else {
                System.out.println("不是闰年");
            }
        } else {
// 普通闰年
            if (year % 4 == 0) {
                System.out.println("是闰年");
            } else {
                System.out.println("不是闰年");
            }
        }

注意事项1 悬垂 else 问题

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

if / else 语句中可以不加大括号,但是也可以写语句(只能写一条语句)。此时 else 是和最接近的 if 匹配,但是实际开发中我们不建议这么写,最好加上大括号。

注意事项2 代码风格问题

复制代码
// 风格1
int x = 10;
if (x == 10) {
   // 满足条件
} else {
   // 不满足条件
}
// 风格2
int x = 10;
if (x == 10)
{
    // 满足条件
}
else
{
    // 不满足条件
}

虽然两种方式都是合法的, 但是 Java 中更推荐使用风格1,{ 放在 if / else 同一行。

注意事项3 分号问题

复制代码
int x = 20;
if (x == 10); {
    System.out.println("hehe");
}

// 运行结果

hehe

此处多写了一个分号, 导致分号成为了 if 语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块。

2.2 switch 语句

基本语法

复制代码
switch(整数|枚举|字符|字符串){
            case 内容1 : {
                内容满足时执行语句;
                [break;]
            }
            case 内容2 : {
                内容满足时执行语句;
                [break;]
            }
...
            default:{
                内容都不满足时执行语句;
                [break;]
            }
        }

代码示例: 根据 day 的值输出星期

复制代码
int day = 1;
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 中值的不同, 会执行对应的 case 语句。 遇到 break 就会结束该 case 语句。如果 switch 中的值没有匹配的 case, 就会执行 default 中的语句,建议一个 switch 语句最好都要带上 default。

注意事项1 break 不要遗漏, 否则会失去 "多分支选择" 的效果

复制代码
int day = 1;
switch(day) {
    case 1:
        System.out.println("星期一");
    // break;
    case 2:
        System.out.println("星期二");
        break;
}

// 运行结果

星期一

星期二

不写 break 的时候, case 语句会依次向下执行, 从而失去了多分支的效果。

注意事项2 switch 中的值只能是 整数|枚举|字符|字符串

复制代码
double num = 1.0;
switch(num) {
    case 1.0:
        System.out.println("hehe");
        break;
    case 2.0:
        System.out.println("haha");
        break;
}

编译会出错。

注意事项3 switch 不能表达复杂的条件

复制代码
// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
// 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示. 
if (num > 10 && num < 20) {
    System.out.println("hehe");
}

注意事项4 switch 虽然支持嵌套, 但是很丑

复制代码
int x = 1;
int y = 1;
switch(x) {
    case 1:
        switch(y) {
            case 1:
                System.out.println("hehe");
                break;
        }
        break;
    case 2:
        System.out.println("haha");
        break;
}

代码的美观程度也是一个重要的标准。

综上, 我们发现, switch 的使用局限性是比较大的。

三、循环结构

3.1 while 循环

基本语法格式:

复制代码
while(循环条件){
    循环语句;
}

循环条件为 true, 则执行循环语句; 否则结束循环。

代码示例1: 打印 1 - 10 的数字

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

代码示例2: 计算 1 - 100 的和

复制代码
int n = 1;
int result = 0;
while (n <= 100) {
    result += n;
    n++;
}
System.out.println(num);

// 执行结果

5050

代码示例3: 计算 5 的阶乘

复制代码
int n = 1;
int result = 1;
while (n <= 5) {
    result *= n;
    n++;
}
System.out.println(num);

// 执行结果

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 = " + sum);

这里我们发现, 当一个代码中带有多重循环的时候, 代码的复杂程度就大大提高了,而比较复杂的代码就更容易出错。后面我们会采用更简单的办法来解决这个问题。

注意事项

  1. 和 if 类似, while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句,建议还是加上 { }

  2. 和 if 类似, while 后面的 { 建议和 while 写在同一行。

  3. 和 if 类似, while 后面不要多写分号, 否则可能导致循环不能正确执行。

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

// 执行结果

无任何输出, 程序死循环

此时 ; 为 while 的语句体(这是一个空语句), 实际的 { } 部分和循环无关。此时循环条件死循环了。

3.2 break

break 的功能是让循环提前结束。

代码示例: 找到 100 - 200 中第一个 3 的倍数

复制代码
int num = 100;
while (num <= 200) {
    if (num % 3 == 0) {
        System.out.println("找到了 3 的倍数, 为:" + num);
        break;
    }
    num++;
}

// 执行结果

找到了 3 的倍数, 为:102

执行到 break 就会让循环结束。

3.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 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句。

3.4 for 循环

基本语法

复制代码
for(表达式1;表达式2;表达式3){
    循环体;
}

表达式1: 用于初始化循环变量

表达式2: 循环条件

表达式3: 更新循环变量

相比于 while 循环, for 循环将这三个部分合并在一起, 写代码时不容易遗漏

代码示例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 = " + sum);

// 执行结果

5050

代码示例3: 计算 5 的阶乘

复制代码
int result = 0;
for (int i = 1; i <= 5; i++) {
    result *= i;
}
System.out.println("result = " + result);

代码示例4: 计算 1! + 2! + 3! + 4! + 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 = " + sum);

注意事项 (和while循环类似)

  1. 和 if 类似, for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句, 建议还是加上 { }

  2. 和 if 类似, for 后面的 { 建议和 while 写在同一行。

  3. 和 if 类似, for 后面不要多写 分号, 否则可能导致循环不能正确执行。

相关推荐
zhangfeng113326 分钟前
openclaw skills 小龙虾技能 通讯仿真 matlab skill Simulink Agentic Toolkit,通过kimi找到,mcp通讯
开发语言·matlab·openclaw·通讯仿真
Javatutouhouduan7 小时前
2026Java面试的正确打开方式!
java·高并发·java面试·java面试题·后端开发·java编程·java八股文
chao1898447 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
JAVA面经实录9177 小时前
Java初级最终完整版学习路线图
java·spring·eclipse·maven
赏金术士7 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
Cat_Rocky8 小时前
k8s-持久化存储,粗浅学习
java·学习·kubernetes
楼兰公子8 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
知识领航员8 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
吴声子夜歌9 小时前
Go——并发编程
开发语言·后端·golang
释怀°Believe9 小时前
Spring解析
java·后端·spring