为啥 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 语句没有大括号?的主要内容,如果未能解决你的问题,请参考以下文章