本文目录导读:
- Switch语句是什么?
- Switch语句的“长相”(基本语法)
- if-else
而要用
switch?">为什么不用
if-else而要用
switch- ?
- Switch语句的“高级玩法”(现代语法)
- 一个完整的案例带你理解
一个变量可能有多种不同的值,而你需要根据这些不同的值,执行不同的操作?
根据用户输入的数字1到7,打印出“星期一”到“星期日”,或者,根据订单的状态码(0:待支付,1:已支付,2:已发货,3:已完成),执行不同的业务逻辑。
面对这种“多选一”的场景,很多初学者会下意识地使用一连串的
if-else if-else语句,虽然这样能解决问题,但当分支数量增多时,代码会变得冗长、可读性差,且容易出错。
语句,虽然这样能解决问题,但当分支数量增多时,代码会变得冗长、可读性差,且容易出错。
这时候,就需要请出我们今天的主角:Switch语句。
Switch语句是什么?
Switch语句是一种用于执行“多路分支”选择的结构化控制流语句。
它的核心思想是:将一个表达式的结果,与一系列预先定义好的“case”标签中的常量进行比较,一旦找到匹配项,就执行该标签下对应的代码块。
你可以把它想象成一个精准的“分拣机”:
- 输入(表达式):把需要判断的值(比如一个整数、字符)放入分拣机。
- 分拣口(Case):分拣机里有多个标记好的分拣口,每个口对应一个特定的值(如 1、2、3...)。
- 执行动作:当表达式值与某个分拣口的值一致时,就触发该分拣口对应的动作。
- 默认出口(Default):如果所有分拣口都不匹配,则触发一个默认的出口。
Switch语句的“长相”(基本语法)
虽然不同编程语言(如C、Java、JavaScript、C#)的Switch语法略有差异,但核心结构大同小异,我们以最常用的形式为例:
switch (表达式) {case 值1:
// 当表达式 === 值1 时,执行这里的代码
break; // 执行完跳出switch,防止“贯穿”到下一个case
case 值2:
// 当表达式 === 值2 时,执行这里的代码
break;
case 值3:
// 当表达式 === 值3 时,执行这里的代码
break;
// ... 可以有更多case
default:
// 如果表达式与任何case都不匹配,执行这里的代码
break;
}
关键角色介绍:
- 表达式:这是被评估的对象,它通常是一个变量、一个简单的运算结果,或者常量,这个表达式的类型需要与
case的值类型兼容。
- 的值类型兼容。
- case 值:一个具体的、常量表达式(不能是变量或范围),它定义了程序需要匹配的“路牌”。
- 的代码,这个现象叫做“贯穿”(Fall-through)。
- 都不匹配时,就执行这里的代码,它通常放在最后。
- 用
- )、需要做多重逻辑组合、或者分支数量很少(1-2个)。
- 用
- 的场景:判断的是一个固定、离散的值列表(如菜单选项、状态码、星期几、月份),并且分支较多时,它让代码更像“配置”而非“逻辑”。
- 更简洁:去掉了
- 等冗余关键字。
- 更安全:使用
- 而导致的“贯穿”错误。
- 可作为表达式:可以直接赋值给变量或作为函数返回值,使代码更函数式。
- 功能更强大:逐渐支持模式匹配,甚至可以匹配数据类型、结构等(如C# 9+、Rust)。
0:待支付
- :待支付
- :已支付
- :已发货
- :已完成
- 其他:未知状态
break关键字:非常重要!当程序执行完某个
case的代码后,
break的作用是立即跳出整个
switch结构,防止程序“掉下去”继续执行下一个
case的代码,这个现象叫做“贯穿”(Fall-through)。
default关键字:一个可选的“兜底”选项,当表达式的值与所有
case都不匹配时,就执行这里的代码,它通常放在最后。
为什么不用
if-else而要用
switch?
?
这可能是你最关心的问题,两者之间的选择,主要看场景:
特性 if-else语句 Switch语句 判断条件 可以处理复杂的、非恒等的条件(如 a > 10 && b < 5)
只能处理“值与某个常量是否相等”的比较 可读性 当分支多于4-5个时,代码会变得嵌套、难以阅读 结构清晰,扁平化,一目了然,尤其适合处理离散映射关系 性能 在分支很多时,通常比 switch慢
某些语言/编译器会对 switch进行优化(如使用跳转表),在分支多时性能更优
适用类型 可判断任意类型、任意布尔表达式 主要适用于整数、字符、枚举以及部分语言支持的 string类型(在Java 7+、C# 7+中) 类型(在Java 7+、C# 7+中) if-else的场景:需要判断范围(如
score >= 60)、需要做多重逻辑组合、或者分支数量很少(1-2个)。
switch的场景:判断的是一个固定、离散的值列表(如菜单选项、状态码、星期几、月份),并且分支较多时,它让代码更像“配置”而非“逻辑”。
Switch语句的“高级玩法”(现代语法)
随着语言的发展,许多现代编程语言(如Java 14+、C# 8+、JavaScript/TypeScript)为
switch语句引入了更强大、更优雅的语法形式,通常被称为“Switch 表达式”或“模式匹配”,它不再是一个语句,而是一个可以返回值的“表达式”。
语句引入了更强大、更优雅的语法形式,通常被称为“Switch 表达式”或“模式匹配”,它不再是一个语句,而是一个可以返回值的“表达式”。
以 JavaScript/TypeScript 为例:
// 传统 Switch
function getDayName_old(day) {
let name;
switch (day) {
case 1: name = "Mon"; break;
case 2: name = "Tue"; break;
// ...
default: name = "Unknown";
}
return name;
}
// 现代 Switch 表达式(更简洁、更安全)
function getDayName_new(day) {
return getDayName(day) {
case 1 => "Mon"; // 直接返回值
case 2 => "Tue";
case 3 => "Wed";
// ...
default => "Unknown"; // 甚至可以省略 default,如果覆盖所有 case
};
}
现代Switch表达式的优势:
break、
return等冗余关键字。
=>箭头,避免了传统
switch因忘记写
break而导致的“贯穿”错误。
一个完整的案例带你理解
假设我们写一个根据订单“状态码”决定显示文字的函数,状态码定义如下:
1:已支付
2:已发货
3:已完成
使用传统
switch语句(Java / C# / JavaScript 风格):
语句(Java / C# / JavaScript 风格):
public String getStatusText(int statusCode) {String statusText;
switch (statusCode) {
case 0:
statusText = "待支付";
break;
case 1:
statusText = "已支付";
break;
case 2:
statusText = "已发货";
break;
case 3:
statusText = "已完成";
break;
default:
statusText = "未知状态";
break;
}
return statusText;
}
使用现代
switch表达式(Java 14+ 风格):
表达式(Java 14+ 风格):
public String getStatusText(int statusCode) {return switch (statusCode) {
case 0 -> "待支付";
case 1 -> "已支付";
case 2 -> "已发货";
case 3 -> "已完成";
default -> "未知状态";
};
}
可以看到,现代版本不仅代码量更少,而且逻辑更清晰,消除了潜在的错误(忘记
break)。
)。
Switch语句不是
if-else的替代品,而是其特定场景下的“效率工具”。当你面对一个“根据一个离散值做多选一”的问题时,
switch是你的不二之选,它让代码更干净、更易读,甚至在某些情况下性能更好。
是你的不二之选,它让代码更干净、更易读,甚至在某些情况下性能更好。
希望你现在已经理解了
switch语句到底是什么意思,不妨找一些实际场景(比如写一个简易计算器根据运算符做加减乘除),动手尝试一下吧!
语句到底是什么意思,不妨找一些实际场景(比如写一个简易计算器根据运算符做加减乘除),动手尝试一下吧!
- THE END -
