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

cod*_*ode 5 javascript c java syntax switch-statement

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;
}
Run Code Online (Sandbox Code Playgroud)

这种语法看起来非常像 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Lun*_*din 5

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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