为啥 switch 语句没有大括号?

Posted

技术标签:

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

【讨论】:

以上是关于为啥 switch 语句没有大括号?的主要内容,如果未能解决你的问题,请参考以下文章

java 为啥数组这里要用大括号?

switch结构case语句后的多个语句必须放在花括号中。 这句话对吗?为啥?

java中那些情况使用if语句时可以不用else?

JAVA流程控制语句

Java ——if条件语句 switch语句

switch语句括号中的东西为啥一定得是整型的?