当前位置: 首页 > news >正文

JAVA基础——程序流程控制(分支结构)

JAVA基础——程序流程控制(分支结构)

一、程序流程控制概述

程序的执行顺序分为三种结构:

  1. 顺序结构:代码自上而下逐行执行(默认结构)。
    System.out.println("A");  // 先执行
    System.out.println("B");  // 再执行
    
  2. 分支结构:根据条件判断结果选择执行不同代码块。
    • 关键词:ifswitch
  3. 循环结构:重复执行某段代码(后续章节详细讲解)。

二、分支结构 - if语句

2.1 if语句的三种形式

2.1.1 单分支结构(if)
  • 格式
    if (条件表达式) {// 条件为true时执行的代码
    }
    
  • 执行流程
    先判断条件表达式,若为true则执行大括号内代码,否则跳过。
  • 注意事项
    • 条件表达式必须是布尔值(true/false)。
    • 若大括号内只有一行代码,可省略大括号,但不建议省略(增强可读性)。
  • 示例
    int score = 59;
    if (score >= 60) {System.out.println("成绩及格");
    }
    // 输出:无(条件为false,跳过)
    
2.1.2 双分支结构(if-else)
  • 格式
    if (条件表达式) {// 条件为true时执行
    } else {// 条件为false时执行
    }
    
  • 执行流程
    条件为true执行if块,否则执行else块,二者必选其一。
  • 示例
    int age = 17;
    if (age >= 18) {System.out.println("成年");
    } else {System.out.println("未成年");  // 输出:未成年
    }
    
2.1.3 多分支结构(if-else if-else)
  • 格式
    if (条件1) {// 条件1为true时执行
    } else if (条件2) {// 条件2为true时执行
    } else {// 所有条件都为false时执行
    }
    
  • 执行流程
    按顺序判断条件,遇到第一个true的条件执行对应代码块,后续条件不再判断;若全为false,执行else块(可选)。
  • 示例
    int temp = 25;
    if (temp < 0) {System.out.println("穿大衣");
    } else if (temp < 10) {System.out.println("穿毛衣");
    } else if (temp < 20) {System.out.println("穿T恤");
    } else if (temp < 30) {System.out.println("穿短裤");  // 输出:穿短裤
    } else {System.out.println("穿短裙");
    }
    

2.2 if语句的注意事项

  1. 条件表达式
    • 只能是布尔值,不能用赋值表达式(如if (a=5)是错误的,应为if (a==5))。
  2. 大括号规范
    • 即使只有一行代码,也建议保留大括号,避免逻辑错误。
  3. 嵌套使用
    • if语句中可嵌套其他if语句,用于复杂条件判断。
      int score = 85;
      String level;
      if (score >= 60) {if (score >= 80) {level = "优秀";  // score >= 80时执行} else {level = "及格";}
      } else {level = "不及格";
      }
      

三、分支结构 - switch语句

3.1 switch语句的格式与执行流程

  • 格式
    switch (表达式) {case1:// 代码块1break;case2:// 代码块2break;...default:// 所有case都不匹配时执行break;
    }
    
  • 执行流程
    1. 计算表达式的值。
    2. 依次与每个case后的值比较,匹配成功则执行对应代码块,遇到break跳出switch。
    3. 所有case都不匹配时,执行default块(可选)。

3.2 关键细节

  1. 表达式类型
    • 支持byteshortintcharString(JDK7+)、枚举(JDK5+)。
    • 不支持longfloatdouble等。
  2. case值要求
    • 必须是字面量(如10'A'"abc"),不能是变量。
    • 值必须唯一,不能重复。
  3. break的作用
    • 必须手动添加,否则会发生穿透现象(执行当前case后,继续执行后续所有case,直到遇到break或switch结束)。
      int day = 2;
      switch (day) {case 1:System.out.println("周一");case 2:System.out.println("周二");  // 穿透!case 3:System.out.println("周三");  // 输出:周二、周三(无break)break;default:System.out.println("其他");
      }
      
  4. default的位置
    • 可放在任意位置,但建议放在最后,逻辑更清晰。

3.3 switch与if的对比

场景ifswitch
条件类型支持区间判断(如a>10支持等值判断(如a==10
代码可读性区间判断更直观等值判断更简洁
性能条件多时效率可能下降效率稳定(哈希表优化)
适用场景天气温度、考试等级等区间判断菜单选项、月份、星期等等值判断

示例:菜单选择(switch更合适)

int choice = 2;
switch (choice) {case 1:System.out.println("查看余额");break;case 2:System.out.println("转账");  // 输出:转账break;case 3:System.out.println("退出");break;default:System.out.println("无效选择");
}

四、分支结构的应用场景

4.1 if语句典型场景

  • 区间判断:如成绩等级、温度区间、年龄分段等。
    // BMI健康评估
    double bmi = 22.5;
    if (bmi < 18.5) {System.out.println("体重过低");
    } else if (bmi < 24.9) {System.out.println("正常");  // 输出:正常
    } else {System.out.println("超重");
    }
    

4.2 switch语句典型场景

  • 等值判断:如用户输入选项、枚举类型处理、协议类型匹配等。
    // 交通信号灯控制(枚举示例)
    enum TrafficLight { RED, YELLOW, GREEN }
    TrafficLight light = TrafficLight.GREEN;
    switch (light) {case RED:System.out.println("停车");break;case YELLOW:System.out.println("准备");break;case GREEN:System.out.println("通行");  // 输出:通行break;
    }
    

五、分支结构常见错误与注意事项

  1. if条件误用
    • 错误:if (a = 5)(应为if (a == 5))。
    • 原因:赋值表达式a=5的结果是int类型,而非布尔值。
  2. switch穿透忘记break
    • 后果:导致多个case被执行,逻辑混乱。
    • 解决:每个case后必须添加break(除非故意利用穿透特性简化代码)。
  3. switch表达式类型不匹配
    • 错误:switch (longNum)(long类型不支持)。
    • 解决:改用if-else或转换为支持的类型(如int)。

六、总结

分支结构格式特点适用场景
if支持单分支、双分支、多分支,条件可为区间或等值判断区间判断、复杂逻辑
switch等值判断,表达式类型有限,需手动添加break避免穿透等值枚举、固定选项

选择建议

  • 区间判断或条件复杂时用if
  • 等值判断且条件明确时用switch,代码更简洁优雅。

相关文章:

  • 在 Excel 中使用东方仙盟软件————仙盟创梦IDE
  • linux关闭某端口暂用的进程
  • LinkedList源码分析
  • Jenkins+Docker+Harbor快速部署Spring Boot项目详解
  • 基于正点原子阿波罗F429开发板的LWIP应用(3)——Netbiosns功能
  • Python爬虫(30)Python爬虫高阶:Selenium+Scrapy+Playwright融合架构,攻克动态页面与高反爬场景
  • 采集需要登录网站的教程
  • [每日一题] 3355. 零数组变换 i
  • [ 计算机网络 ] 深入理解TCP/IP协议
  • MySQL 8.0 OCP 1Z0-908 161-170题
  • C++23 新增扁平化关联容器详解
  • 数据挖掘:从数据堆里“淘金”,你的数据价值被挖掘了吗?
  • 题海拾贝:P2285 [HNOI2004] 打鼹鼠
  • Linux线程互斥与同步(上)(29)
  • vue3 + echarts(5.6.0)实现渐变漏斗图
  • Rocketmq broker 是主从架构还是集群架构,可以故障自动转移吗
  • Android Edge-to-Edge
  • C++ Pimpl(Pointer to Implementation)设计思想
  • 香港科技大学广州香港科技大学硕博士研究生学位项目宣讲会(智能制造硕博士物理学硕士)—深圳大学专场
  • TuyaOpen横空出世!涂鸦智能如何用开源框架重构AIoT开发范式?
  • 上海发布台风红色预警?实为演练,今日下午局部中雨下班请注意
  • 重庆一男大学生掉进化粪池死亡,重庆对外经贸学院:以学校通报为准
  • 莱布雷希特专栏:古典乐坛边缘人
  • 上影节公布今年IMAX片单:暗涌、重生与感官的史诗
  • 假冒政府机构账号卖假货?“假官号”为何屡禁不绝?媒体调查
  • 世卫大会中国代表团:中国深入参与全球卫生治理,为构建人类卫生健康共同体贡献中国力量