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

Why don't switch statements have curly braces?

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 语句不应该符合语法风格吗?

在类 C 编程语言中,带有冒号的标识符用作跳转的标签。

label:   
// ...
goto label;  

JavaScript 没有 goto 语句但仍有标签。

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

switch语句中,每个case都有一个标签。 switch 语句有自己的列表,用于那些名为 jump table 的标签。当给定值匹配时,跳转到该标签并执行每个代码如下goto

case 语句在 C 中实际上被视为标签,类似于 goto 使用的标签。为什么它被设计成这样很难回答,并且需要挖掘丹尼斯·里奇 (Dennis Ritchie) 的各种旧出版物。

更重要的是,对于现在,您可以使用带大括号的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;
  }
}

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