Language agnostic 在switch情况下是否缺少大括号语法?
虽然我们都熟悉:Language agnostic 在switch情况下是否缺少大括号语法?,language-agnostic,programming-languages,syntax,Language Agnostic,Programming Languages,Syntax,虽然我们都熟悉: switch(x){ case 1: do_something(); break; case 2: do_something_else(); break; default: do_default(); break; } 我想知道在任何一种语言中是否存在这样的语法变体: switch(x){ case(1){ do_something(
switch(x){
case 1:
do_something();
break;
case 2:
do_something_else();
break;
default:
do_default();
break;
}
我想知道在任何一种语言中是否存在这样的语法变体:
switch(x){
case(1){
do_something();
}
case(2){
do_something_else();
}
default{
do_default();
}
}
当我写这篇文章时,我意识到没有明确的方法来指示某个案例是非中断的,并且程序流应该级联到后续案例中。很可能这就是原因,但我一直很好奇,为什么我顺便看到的C族语言(我来自PHP)放弃了
switch
constructcase
语句的大括号语法,但是,基于C的语言支持类似的语法,您可以在case语句中创建匿名代码块,如下所示:
switch(x){
case(1): {
do_something();
} break;
case(2): {
do_something_else();
} break;
default: {
do_default();
}
}
如果您想在您的案例中定义变量的范围,这是很好的。当然,您仍然需要
中断
以避免失败。不是一种类似C的语言,但Perl的语法实际上与您所描述的一样。从文档中:
use feature ":5.10";
given($foo) {
when (undef) {
say '$foo is undefined';
}
when ("foo") {
say '$foo is the string "foo"';
}
when ([1,3,5,7,9]) {
say '$foo is an odd digit';
continue; # Fall through
}
when ($_ < 100) {
say '$foo is numerically less than 100';
}
when (\&complicated_check) {
say 'a complicated check for $foo is true';
}
default {
die q(I don't know what to do with $foo);
}
}
使用功能“:5.10”;
给定($foo){
何时(未定义){
说“$foo未定义”;
}
何时(“foo”){
说“$foo是字符串“foo”;
}
当([1,3,5,7,9]){
说“$foo是一个奇数”;
继续;#失败
}
当($\小于100){
假设“$foo在数字上小于100”;
}
何时(\&U检查){
说“一张复杂的$foo支票是真的”;
}
违约{
die q(我不知道如何处理$foo);
}
}
在C中,大括号所做的只是定义变量的作用域(代码可以访问这些变量),而不是用于流控制。表明该案失败的唯一明确方法是对其进行评论
switch (a)
{
case 0:
doSomethingSpecial();
// Deliberate fall-through
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
}
据我所知,没有一种语言需要大括号作为
开关
/大小写
语法的一部分。这不一定有什么意义,因为大括号通常会引入“块范围”,这在case
语句之间通常不起作用
但是,您可能想知道,在某些语言(如C++)中,您可以将大括号作为case语句的一部分(而不是switch/case语法本身的一部分)来引入自己的有界范围:
switch (x) {
case a:
{
...
break;
}
}
<>有时候,C++编译器会要求你这样做,尤其是当你在引用一句话,“模式匹配可能被视为if-then-else和case语句的更复杂的替代方案。”在常见的Lisp case构造()中,每个不同的选项都在一个单独的s-expr中处理;不需要“中断”,标签后有一个隐式的
progn
,因此允许使用多种形式
但是没有失败的选择
(case x
((1 2 3) (do-this))
((4 5) (do-that))
(otherwise (do-something-else)))
Mathematica使用以下开关语法:
Switch[
x,
1, action[1],
2, action[2],
_, defaultaction[]
]
也就是说,表达式
x
,然后是模式和动作的交替序列。标记\uuuuuuu
是一个表示任何表达式的模式对象,因此定义了默认值。在C/C++/Java中,开关分支失效。然而,在C#中,不允许分支通过so,虽然C#switch语法中也没有大括号,但是缺少通过删除任何语法优势——除了可能省略“case terminator”;我记得不久前我在熟悉C#的时候也读过这篇文章。在本例中,虽然不允许使用这种语法,但允许使用这种语法不会有任何缺点。出于好奇(我会在谷歌上搜索一下),为什么C#不允许掉入?我的回答没有帮助吗?这似乎是您描述的语法的一个很好的例子。@Mr.Wizard;很抱歉,确实是这样,但是eldarerathis给出的例子更接近我感兴趣的东西。switch
的语法偏差一直激发着我对“大括号块”语言的好奇心+1.让我重新关注它;我正在学习C
,作为一个教育项目,我正在为我正在创建的一种简单脚本语言编写一个解释器。任何信息都是好信息!但那是另一种野兽;没有给出何时要求您显式编写继续
,以便失败?或者我是倒着说的?@Tomalak:是的,这与大多数C风格的switch语句相反。您必须明确地继续
,以避免在给定条件下中断
-ing。在我看来,这似乎与OP所暗示的一样,但是,基于这样一个事实,即他在第二个示例中留下了显式的break
s,但似乎将它们彼此等同(即,为了使他的第一个示例具有与带大括号的第二个示例相同的流,第二个示例中的每个块都必须具有隐式的break
).谢谢你,埃尔达拉斯;非常有趣。我一直在被动地选择一种新的语言(从PHP到Perl/Python/Ruby),而其他人则在很大程度上考虑应用程序的因素,Perl有着古怪的结构,我喜欢这种结构。请注意你对我的第二个例子的假设;隐式断裂是由意外设计造成的:P@eldarerathis:那么这个答案与开关箱无关。o。O@Tomalak例如我不太清楚你的意思。问题是“我想知道在任何语言中是否存在这样的语法变体:[code]”,我想表明Perl的语法看起来几乎与他发布的内容相同。switch
(在C/C++/Java中,而不是在C#中)有一种失败行为,但通常在if-then-else或模式匹配结构中都找不到。它通常还有一个被比较值的限制,这个限制(例如,对于较小的数字)可用于编译器创建直接跳转表