【问题标题】:Why don't switch statements have curly braces?为什么 switch 语句没有大括号?
【发布时间】:2022-01-20 01:41:11
【问题描述】:

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 语句不应该与语法样式匹配吗?

【问题讨论】:

  • 将每个case 视为goto 的标签。但是没有goto,而是switch 正在跳转到标签。
  • C 是他们都继承的原始版本。有关详细信息,请参阅stackoverflow.com/a/36394985/53897
  • 也许你应该问为什么其他语言看起来不像 C ;-) 顺便说一句,只是为了进一步混淆你 :-),你 可以 这样做:switch (expression) { case one: { // do something } break; }
  • switch 语句找到匹配的案例时,该案例之下的每个代码都会执行直到遇到break。您建议的语法似乎只运行匹配大小写。
  • 关于语言为什么是这样的问题经常有有用的答案。语言不是从虚无中产生的,也不是通过掷骰子产生的。询问为什么它们的设计方式是完全合理的。将其关闭为“不可重现或由拼写错误引起”是对关闭系统的滥用。

标签: javascript java c syntax switch-statement


【解决方案1】:

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】:

    在类似 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

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多