Switch 在传统编程语言中属于**语句**,用于根据条件执行不同分支,本身不返回值,随着语言演进,switch 逐渐从语句向**表达式**演变,C# 8.0、Java 14 引入了 switch 表达式,使其可以直接求值并返回结果,增强了代码的简洁性与函数式风格,这一演进体现了现代语言对**表达式导向编程**的追求,减少了临时变量和副作用,使逻辑更紧凑、可读性更高,本质上,switch 表达式的类型取决于其各分支返回值的公共类型(或通过模式匹配推导),为开发者提供了更灵活的控制流工具。

如果你是编程初学者,或者刚从 C/Java 转向 Kotlin、Scala 等现代语言,很可能被这样一个问题困扰:switch 到底是什么类型的表达式? 它像语句那样执行一系列动作,却又在某些语言里能返回一个值;它看起来是流程控制,却又具备“求值”的特性,要回答这个问题,我们得先理清编程语言中“表达式”与“语句”的根本区别,再回头看 switch 在不同语言中的真实身份。


表达式 vs 语句:基础概念回顾

在绝大多数编程语言中:

  • 表达式(Expression):是求值的单元,可以产生一个值。a + bx > 0 ? "yes" : "no"、函数调用 getAge()
  • 语句(Statement):执行一个动作,不产生值(或者只产生副作用)。ifforreturn、赋值语句(在部分语言中赋值也是表达式)。

关键区别在于:表达式能放在赋值号右侧,语句不能

// 表达式
let result = (1 + 2) * 3;   // 合法
// 语句(if不能作为值)
let result = if (true) { 1 } else { 2 }; // 非法(在JavaScript中)

带着这个标准,我们来看 switch。


传统语言的 switch:纯粹的语句

C、Java、JavaScript 中的 switch

在 C 语言、Java(经典版本)以及 JavaScript 中,switch 是一个语句,它的作用是依据某个表达式的值跳转到对应的 case 分支,执行一系列语句,然后通常以 break 结束,整个结构不返回任何值,不能用作右值。

// Java:switch是语句
String msg;
switch (grade) {
    case 'A': msg = "优秀"; break;
    case 'B': msg = "良好"; break;
    default: msg = "未知";
}
// 不能写:String msg = switch(...) {...};

JavaScript 同样:

// JavaScript:switch是语句
let type;
switch (key) {
    case 1: type = "数字"; break;
    case 'a': type = "字母"; break;
}

这类语言的 switch 完全符合“语句”的定义:它控制执行流程,产生副作用(比如赋值),但不产生值。


现代语言的 switch:从语句到表达式的进化

随着函数式编程理念的普及,越来越多的语言允许流程控制结构本身也返回值,于是出现了 switch 表达式

Kotlin 的 when

Kotlin 中的 when 既是语句也是表达式,作为表达式时,它可以返回值:

val grade = 85
val result = when (grade) {
    in 90..100 -> "优秀"
    in 80..89 -> "良好"
    else -> "需努力"
}
// result 被赋值为 "良好"

when 就是一个表达式,因为它最终求值成一个字符串。

Scala 的 match

Scala 的 match 天生就是表达式:

val x = 2
val description = x match {
    case 1 => "one"
    case 2 => "two"
    case _ => "other"
}
// description = "two"

match 直接返回分支表达式的值,属于典型的模式匹配表达式

Rust 的 match

Rust 的 match 也是表达式,每个分支的最后表达式就是返回值:

let number = 5;
let description = match number {
    1 => "one",
    2 | 3 | 5 => "prime",
    _ => "composite"
};
// description = "prime"

C# 的 switch 表达式(C# 8.0+)

传统 C# 的 switch 是语句,但从 C# 8.0 开始引入了 switch 表达式(使用 => 和丢弃模式):

string result = grade switch
{
    >= 90 => "优秀",
    >= 80 => "良好",
    _ => "需努力"
};

这里的 switch 已经是一个表达式,可以出现在赋值语句右侧。

Java 的 switch 表达式(Java 14+)

Java 也在进化:从 Java 14 起,switch 也可以作为表达式,使用 ->yield 返回值:

String result = switch (grade) {
    case 'A' -> "优秀";
    case 'B' -> "良好";
    default -> {
        System.out.println("未知");
        yield "未评级";
    }
};

Python 的 match(3.10+)

Python 本身没有传统的 switch 语句,但从 3.10 版本开始引入了 match 语句(结构模式匹配),虽然官方文档称其为“语句”,但在实际使用中,它可以根据匹配结果进行分支赋值,配合 case 中的表达式,可以视作一种半表达式式的结构。

match status:
    case 200:
        msg = "OK"
    case 404:
        msg = "Not Found"
    case _:
        msg = "Unknown"

Python 的 match 不能直接作为值赋给变量(需要显式赋值),本质上仍是语句,但它的模式匹配能力使代码更加简洁。


为什么会有这种差异?——语言设计哲学

  • 语句式 switch:源自 C 语言时代的流程控制思想,强调“做什么”,副作用明确,逻辑直观。
  • 表达式式 switch:来自函数式语言(ML、Haskell)以及现代多范式语言,强调“值就是一切”,减少可变状态,让代码更简洁、更可组合。

表达式式 switch 的最大优点:避免临时变量,让分支逻辑直接成为值的一部分,减少出错机会(例如忘记 break 导致穿透),它也促进了不可变风格的编程,让代码更接近数学函数定义。


switch 的类型由语言决定

回到最初的问题——“switch 是什么类型表达式?”答案取决于上下文:

语言 / 版本 switch 的类型 能否作为表达式
C / 经典 C++ 语句
Java(< 14) 语句
JavaScript 语句
Kotlin 语句或表达式 ✅(when 表达式)
Scala 表达式 ✅(match)
Rust 表达式 ✅(match)
C# 8.0+ 表达式 ✅(switch 表达式)
Java 14+ 表达式 ✅(switch 表达式)
Python 3.10+ 语句(match) 可视为半表达式

理解 switch 必须先确定语言及其版本,在传统语言中它是语句,管理流程;在现代语言中它进化成了表达式,可以传递值,随着编程范式的不断融合,switch 的类型也在从“指令”向“数据”转变,下次当你再问“switch 是什么类型表达式”,不妨先想想你在写哪种语言,然后就能给出准确的答案。


一句话总结: switch 在过去是控制语句,在今天越来越多地成为能够返回值的表达式——这正是编程语言走向表达式的浪潮中的一个缩影。

一个看似简单却暗藏玄机的问题

【1】资源失效及解压密码问题请发邮件给客服:moon520520@hotmail.com 【2】Switch游戏大气层最好更新到最新版本,用DBI安装 【3】PC电脑游戏全部压缩包下载完用RAR解压,安装目录不要有中文