虽然我们都熟悉:
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();
}
}
在我写这篇文章时,我意识到没有 clean 方式来表明某个案例是非破坏性的,并且该程序流应该级联到后续案例中。可能这是足够的理由,但我总是很好奇为什么我在传递中看到的C系列语言(我来自PHP)放弃了switch
构造case
语句的括号语法。
答案 0 :(得分:2)
不是类似C语言,但Perl的given/when语法实际上看起来就像你所描述的那样。来自文档:
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);
}
}
答案 1 :(得分:1)
我不知道任何支持你所说明的第二种方法的语言,但是基于C语言支持类似的语法,你可以在case语句中创建一个匿名代码块,如下所示:
switch(x){
case(1): {
do_something();
} break;
case(2): {
do_something_else();
} break;
default: {
do_default();
}
}
如果要在案例中范围变量,这很好。当然,你仍然需要break
来避免堕落。
答案 2 :(得分:1)
在C中,所有大括号都是定义变量的范围(代码可以访问的位置),它不用于流控制。表明案件失败的唯一干净方法是故意评论
switch (a)
{
case 0:
doSomethingSpecial();
// Deliberate fall-through
case 1:
doSomething();
break;
case 2:
doSomethingElse();
break;
}
答案 3 :(得分:1)
我所知道的语言不需要括号作为switch
/ case
语法的一部分。它不一定有意义,因为大括号通常会引入“块范围”,在case
语句之间通常不。
然而,您可能会感兴趣的是,在某些语言(如C ++)中,您可以使用大括号作为case语句的一部分(而不是作为switch / case语法本身的一部分)介绍你自己的有界范围:
switch (x) {
case a:
{
...
break;
}
}
有时候C ++编译器会要求你这样做,最明显的是当你在case
语句中声明变量时。
答案 4 :(得分:1)
这个wikipedia reference讨论了switch / case结构,紧接着它是模式匹配的函数式编程范例规范。
引用,“模式匹配可能被视为if-then-else和case语句的更复杂的替代方案。”
答案 5 :(得分:1)
Mathematica使用以下开关语法:
Switch[
x,
1, action[1],
2, action[2],
_, defaultaction[]
]
即表达式x
,然后是模式和动作的交替序列。令牌_
是表示任何表达式的模式对象,因此定义了默认值。
答案 6 :(得分:0)
在Common Lisp案例构造(case, ccase, ecase)中,每个不同的选项在一个单独的s-expr中处理;不需要“break”,并且在标签之后存在隐式progn
,因此允许使用多个表单。
然而,没有任何堕落选择......
(case x
((1 2 3) (do-this))
((4 5) (do-that))
(otherwise (do-something-else)))