10.2 switch 语句

根据一个变量的值采取不同操作,这是非常常见的需求。通过 if 语句可以如下实现:

if (X == 1)
  do_something ();
elseif (X == 2)
  do_something_else ();
else
  do_something_completely_different ();
endif

然而,这类代码编写起来很繁琐,维护起来也很麻烦。为了解决这个问题,Octave 支持 switch 语句。使用该语句后,上面的示例变为:

switch (X)
  case 1
    do_something ();
  case 2
    do_something_else ();
  otherwise
    do_something_completely_different ();
endswitch

这段代码将问题的重复结构更清晰地呈现出来,使代码更易于阅读,也更易于维护。此外,如果变量 X 需要改名,使用 switch 语句只需修改一处,而使用 if 语句则每个分支都要分别修改。

switch 语句的一般形式为:

switch (expression)
  case label
    command_list
  case label
    command_list
  ...

  otherwise
    command_list
endswitch

其中 label 可以是任意表达式。但重复的 label 值不会被检测到,只有第一个匹配所对应的 command_list 才会被执行。为了使 switch 语句有意义,至少需要包含一个 case label command_list 子句,而 otherwise command_list 子句是可选的。

如果 label 是一个元胞数组,那么只要该元胞数组中任意一个元素与 expression 匹配,就会执行对应的 command_list。例如,以下程序将打印输出 ‘variable is either 6 or 7’。

A = 7;
switch (A)
  case { 6, 7 }
    printf ("variable is either 6 or 7\n");
  otherwise
    printf ("variable is neither 6 nor 7\n");
endswitch

与其他所有特定的 end 关键字一样,endswitch 可以用 end 替代,但使用具体的关键字可以获得更好的诊断信息。

if 语句相比,switch 语句的一个优势是 label 可以是字符串。如果使用 if 语句,无法这样写:

if (X == "a string") # 这是无效的

因为这样会对 X 与字符串进行逐字符比较,而非判断两个字符串是否相等。switch 语句专门处理了这种特殊情况,因此可以编写如下代码:

switch (X)
  case "a string"
    do_something
  ...
endswitch

版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4