代码之家  ›  专栏  ›  技术社区  ›  code

为什么switch语句没有大括号?

  •  1
  • code  · 技术社区  · 4 年前

    switch语句的典型语法是:

    switch(expression) {
      case one:
        // do something...
        break;
      case two:
        // do something else...
        break;
      case three:
      case four:
        // do something special
        break;
      default:
        // if nothing matches...
        break;
    }
    

    这种语法看起来非常像Python(尤其是冒号和人们缩进它的方式),与JavaScript、Java或C等语言的通用语法相反,在这些语言中,大多数语句都使用大括号。有什么具体的原因吗?

    我希望它看起来更像:

    switch(expression) {
      case (one) {
        // do something...
        break;
      } case (two) {
        // do something else...
        break;
      } case (three) case (four) {
        // do something special
        break;
      } default {
        // if nothing matches...
        break;
      }
    }
    

    我认为我刚才提供的示例看起来像if-else-if-else语句,但switch语句不应该与语法样式匹配吗?

    0 回复  |  直到 4 年前
        1
  •  4
  •   Lundin    4 年前

    case 语句实际上被视为C中的标签,类似于 goto 。为什么它是这样设计的很难回答,这涉及到挖掘丹尼斯·里奇的各种旧出版物。

    今天更重要的是,你 可以 使用 switch 带牙套,甚至被认为是很好的练习。这是有效的C(和C++):

    switch(expression) 
    {
      case one:
      {
        // do something...
        break;
      }
      case two:
      {
        // do something else...
        break;
      }
      case three:
      case four:
      {
        // do something special
        break;
      }
      default:
      {
        // if nothing matches...
        break;
      }
    }
    

    现在,您甚至可以在每个案例中声明局部变量。

        2
  •  2
  •   zmag    4 年前

    在类C编程语言中, 带冒号的标识符 用作的标签 .

    label:   
    // ...
    goto label;  
    

    JavaScript没有 goto 声明,但仍有标签。

    label1: {
      label2: {
        console.log('break nested block');
        break label1;
        console.log('unreachable');
      }
      console.log('unreachable');
    }

    在里面 switch 语句,每个 case 有标签。而且 转换 语句有自己的名为的标签列表 跳转表 当给定值匹配时, 到那个标签并执行每个代码如下 goto .