switch语句可以有多个变量吗?

6 投票
11 回答
1983 浏览
提问于 2025-04-16 14:26

这个问题是关于所有使用 switch 语句的编程语言,比如 C++、C#、PHP、Java、Python 等等。那么,像这样做是否可能呢?

switch (var1, var2)
case  var1 = a:
    something
    break;
case var2 = b:
    something
    break;
case var1 = 0 ,var2 = 1
     etc...

11 个回答

2

CHILL 这个东西可以做到:

PROC (b board LOC,m move) EXCEPTIONS (illegal);
DCL starting square LOC:= b (m.lin_1)(m.col_1),
arriving square LOC:= b (m.lin_2)(m.col_2);
DO WITH m;
IF starting.status=free THEN CAUSE illegal; FI;
IF arriving.status/=free THEN
IF arriving.p.kind=king THEN CAUSE illegal; FI;
FI;
CASE starting.p.kind, starting.p.color OF
   (pawn),(white):
      IF col_1 = col_2 AND (arriving.status/=free
      OR NOT (lin_2=lin_1+1 OR lin_2=lin_1+2 AND lin_2=2))
      OR (col_2=PRED (col_1) OR col_2=SUCC (col_1))
      AND arriving.status=free THEN CAUSE illegal; FI;
      IF arriving.status/=free THEN
      IF arriving.p.color=white THEN CAUSE illegal; FI; FI;
   (pawn),(black):
      IF col_1=col_2 AND (arriving.status/=free
      OR NOT (lin_2=lin_11 OR lin_2=lin_12 AND lin_1=7))
      OR (col_2=PRED (col_1) OR col_2=SUCC (col_1))
      AND arriving.status=free THEN CAUSE illegal; FI;
      IF arriving.status/=free THEN
      IF arriving.p.color=black THEN CAUSE illegal; FI; FI;
   (rook),(*):
      IF NOT ok_rook (b,m)
      THEN CAUSE illegal;
      FI;
   (bishop),(*):
      IF NOT ok_bishop (b,m)
      THEN CAUSE illegal;
      FI;
   (queen),(*):
   IF NOT ok_rook (b,m) AND NOT ok_bishop (b,m)
     THEN CAUSE illegal;
5

Python 没有 switch 语句。推荐的替代方法是使用一系列的 if/else 语句——这其实在你的情况下也是应该使用的。

另一个常见的做法是使用映射(map)。在你的情况下,你可以用一个包含 (var1, var2) 的元组来匹配结果。

switch = {
   (1,2): lambda: ..,
   (3,4): lambda: ...,
}
switch[(var1,var2)]

我不确定这是不是常用的做法,但至少这是可能的。

4

是的/不是。

传统编程语言中没有“switch”语句的那种功能。不过,有一种叫“模式匹配”的东西可以做到这一点。

C#、Java、PHP 和 Python 这些语言不支持模式匹配(对 PHP 我不是很确定,但我觉得它也不支持。如果我错了,请纠正我)。

下面是 Haskell 语言中的一个例子,那里是有模式匹配的。模式匹配在很多函数式编程语言中都存在。

function 1 _ = "first parameter has a one"
function _ 1 = "second parameter is a one"
function _ _ = "I don't know what crazy number you passed in"

当调用这个函数时,运行时环境或编译器会检查第一个函数是否可以被调用。如果可以,它就会返回那个值。然后它会继续查找,直到找到一个适合给定参数的匹配。这里的“_”只是表示“这里可以是任何东西,我不在乎是什么,所以不要把这个值绑定到一个名字上”。如果我在乎这个值,我可以这样做:

function 1 a = "second parameter is " ++ (show a)

因为通常是从上到下执行(和 switch 语句不同),这更像是一个 if/else 结构,而不是 switch 语句那种直接跳到正确位置的方式。它其实就是一个看起来很不错的 if/else。此外,如果我把最一般的情况放在文件的最上面,其他情况就会被忽略。

你也可以用模板做类似的事情,但那只能在编译时生效。

撰写回答