本文目录导读:

  1. 先搞清楚:函数和语句有什么区别?
  2. switch 的庐山真面目:一个控制流语句
  3. 特殊情况:当 switch 变成了表达式
  4. 为什么有人会误以为 switch 是函数?

在学习编程的路上,很多初学者都会遇到一个令人困惑的问题:

switch

看起来有点像函数(有括号、有参数),但它到底是语句还是函数?在面试或技术讨论中,这个问题也偶尔会被拎出来考验基础概念,今天我们就来彻底扒一扒

switch

的真面目。

的真面目。

先搞清楚:函数和语句有什么区别?

要回答这个问题,首先得明确“函数”和“语句”这两个基本概念。

  • 函数:一段可复用的代码块,可以接受输入(参数),执行特定逻辑,并返回一个结果(可以是void

    ,即无返回值),函数通常有名字,可以被调用多次,

    int sum(int a, int b) { return a + b; }

    语句:程序执行的最小独立单元,通常表示一个动作或控制流程,比如赋值语句

    x = 1;

    、条件判断语句

    if (a > b) { ... }

    、循环语句

    for (...) { ... }

    等,语句本身不一定有“返回值”,它只是告诉计算机要做什么。

    等,语句本身不一定有“返回值”,它只是告诉计算机要做什么。

    关键区别:函数可以被调用并产生一个值(即使返回

    void

    ,调用也是表达式的一部分),而语句通常只是执行,不产生值(尽管某些语言中语句也可以是表达式,Python 的赋值表达式,但这不是普遍情况)。

    ,调用也是表达式的一部分),而语句通常只是执行,不产生值(尽管某些语言中语句也可以是表达式,Python 的赋值表达式,但这不是普遍情况)。

    switch 的庐山真面目:一个控制流语句

    绝大多数主流语言(C、C++、Java、JavaScript、PHP、Go 等)中的

    switch

    都是控制流语句,而不是函数,它用于根据一个表达式的值,将程序跳转到多个分支之一执行。

    都是控制流语句,而不是函数,它用于根据一个表达式的值,将程序跳转到多个分支之一执行。

    1 典型语法(以 C 语言为例)

    switch (grade) {

    case 'A':

    printf("优秀\n");

    break;

    case 'B':

    printf("良好\n");

    break;

    default:

    printf("一般\n");

    }

    • switch (grade)

      :圆括号中的

      grade

      表达式,不是函数参数,整个

      switch

      语句不返回任何值,它只是决定执行哪个

      case

      块。

    • 块。
    • break

      是语句,用于跳出 switch;

      default

      是可选的分支。

    • 是可选的分支。
    • 你无法把
    • switch

      的结果赋值给一个变量,因为它没有结果。

    • 的结果赋值给一个变量,因为它没有结果。
    • 2 为什么看起来像函数?

      因为语法上它有圆括号,里面放一个表达式,很多人误以为是在“调用 switch 函数”,圆括号只是 switch 关键字的一部分语法,用于包裹判断条件,就像

      if

      语句也有圆括号一样。

      if

      也是语句,不是函数。

      也是语句,不是函数。

      3 其他语言的验证

    • Java
    • switch

      同样是语句,不能作为表达式使用,Java 12 引入了

      switch

      表达式(预览特性),但那是后来的增强,传统

      switch

      仍是语句。

    • 仍是语句。
    • JavaScript
    • switch

      是语句,不返回值,你可以用

      switch

      控制流程,但不能写

      let result = switch(x) { ... }

    • Python:压根没有
    • switch

      语句,只有

      if-elif-else

      ,后来 3.10 引入了

      match

      语句,但那是模式匹配,且仍然不是函数。

    • 语句,但那是模式匹配,且仍然不是函数。
    • Go
    • switch

      是语句,但 Go 的

      switch

      比较灵活,可以没有表达式(相当于 if-else if 链),并且每个 case 默认带 break,但依然是语句。

    • 比较灵活,可以没有表达式(相当于 if-else if 链),并且每个 case 默认带 break,但依然是语句。
    • 特殊情况:当 switch 变成了表达式

      随着编程语言的发展,一些现代语言开始允许

      switch

      作为表达式使用,即它可以返回一个值,但这只是对传统

      switch

      功能的扩展,本质依然不是函数,而是语言内置的关键字语法。

      功能的扩展,本质依然不是函数,而是语言内置的关键字语法。

      1 C# 8.0+ 的 switch 表达式

      string result = grade switch

      {

      'A' => "优秀",

      'B' => "良好",

      _ => "一般"

      };

      这里

      switch

      被用作“表达式”,返回一个字符串赋值给

      result

      ,但注意,写法变了,不再是传统的

      switch-case

      ,而是使用了

      =>

      箭头语法。

      switch

      依然是语言关键字,不是函数。

      依然是语言关键字,不是函数。

      2 Swift 5.9+ 的 switch 表达式

      Swift 在 5.9 版本中引入了

      switch

      作为表达式的能力:

      作为表达式的能力:

      let result = switch grade {

      case "A": "优秀"

      case "B": "良好"

      default: "一般"

      }

      同样,

      switch

      是一个表达式,可以赋值给变量。

      是一个表达式,可以赋值给变量。

      3 Kotlin 的

      when

      (类似 switch)

      (类似 switch)

      Kotlin 中没有

      switch

      ,而是用

      when

      表达式,它是真正的表达式,可以返回值:

      表达式,它是真正的表达式,可以返回值:

      val result = when (grade) {

      'A' -> "优秀"

      'B' -> "良好"

      else -> "一般"

      }

      when

      也不是函数。

      也不是函数。

      即便在这些语言中,switch(或类似结构)也不是一个你可以自定义或调用的函数,而是语法关键字,由编译器直接处理。

      为什么有人会误以为 switch 是函数?

      除了圆括号的迷惑性,还有以下几个原因:

    • 某些教学材料表述不当:比如把
    • switch

      称为“switch 函数”或“多分支函数”,这是一种不严谨的口语化说法。

    • 称为“switch 函数”或“多分支函数”,这是一种不严谨的口语化说法。
    • 与函数式编程中的
    • match

      混淆:在 Scala、Rust 等函数式语言中,

      match

      是表达式(可返回值),而且看起来很像函数调用,初学者学过多语言后容易概念混淆。

    • 是表达式(可返回值),而且看起来很像函数调用,初学者学过多语言后容易概念混淆。
    • 动态语言的灵活使用:在 JavaScript 中,有人会把
    • switch

      包裹在一个函数里来“模拟”函数的调用,但这只是用法,不改变

      switch

      本身的属性。

    • 本身的属性。
    • 在几乎所有的通用编程语言中,

      switch

      都是一个控制流语句,不是函数。它不产生返回值(除非语言专门提供了 switch 表达式扩展),不能被当作函数来调用,也不能传递参数或接收返回值。

      都是一个控制流语句,不是函数。它不产生返回值(除非语言专门提供了 switch 表达式扩展),不能被当作函数来调用,也不能传递参数或接收返回值。

      函数是可自定义的、可复用的代码块,而

      switch

      是语言内置的语法结构,用于实现多分支选择,两者的定位完全不同。

      是语言内置的语法结构,用于实现多分支选择,两者的定位完全不同。

      下次再遇到这个问题,你可以自信地回答:switch 是语句,不是函数,如果有小伙伴争论,不妨搬出这个答案,再顺便科普一下现代语言中的 switch 表达式——知识就是这样一点点积累起来的。

      switch是函数还是语句?一次彻底搞懂-switch游戏下载社区