在交换机案例中缺少大括号语法?

时间:2011-04-05 19:53:08

标签: 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();
    }
    case(2){
        do_something_else();
    }
    default{
        do_default();
    }
}

在我写这篇文章时,我意识到没有 clean 方式来表明某个案例是非破坏性的,并且该程序流应该级联到后续案例中。可能这是足够的理由,但我总是很好奇为什么我在传递中看到的C系列语言(我来自PHP)放弃了switch构造case语句的括号语法。

7 个答案:

答案 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)))