Select Case
 
条件语句块

语法

Select Case expression
[ Case expressionlist ]
[statements ]
[ Case Else ]
[statements ]
End Select
or
Select Case As Const integer_expression
[ Case constant | enumeration ]
[ statements ]
[ Case Else ]
[ statements ]
End Select

说明


Select Case根据表达式的值执行特定的代码。表达式被评估一次,并且按照每个Case进行比较,直到找到匹配的表达式。匹配的Case分支中的代码被执行,程序跳到Select Case块的末尾。Case Else匹配任何未匹配的情况,因此如果存在Case Else,则至少有一个Case被执行。如果没有Case匹配,则将跳过整个Select Case块。

End Select用于关闭Select Case...End Select块。

C用户注意事项:在FreeBASIC中,Select Case的作用类似于switch块,所有案例的结尾都有break.由于没有直通,单个Case中的多个选项必须放在表达式列表中。

除了整数类型之外,第一种语法也支持浮点数和字符串表达式。

表达式列表的语法:
{ expression | expression To expression | Is relational operator expression }[, ...]

  • expr :评估expr ,并比较与原始表达式的相等性。如果它们相等,则会发现一场比赛。这可以被认为是“Is = expr ??”(见下文)的缩写。
  • expr1 To expr2 :评估expr1 ,并检查它是否小于或等于原始表达式。如果是这样,它将评估expr2 ,并检查它是否大于或等于原始表达式。如果是这样,那么找到匹配。
  • Is relational_operator expr :评估expr ,并使用提供的relational_operator =><<><=>=)对原始操作进行比较。如果比较是真的,那么找到匹配。

可以在每个Case中进行多次检查,通过逗号分隔(,)。一旦找到匹配项,程序完成检查,并继续执行Case块的代码语句。没有进一步的表达式被评估或检查。

表达式列表示例:
情况1不变
情况5.4至10.1范围
案例为>3大于小于
案例1,3,5,7至9匹配一组值
案例x一个变量的值


如果使用As Const,则只能计算整数常量(不包括两个浮点常量的所有数字常量:单和双),并且表达式列表仅支持简单常量和枚举。“To”范围受支持,但“Is”关系运算符不是。

使用As Const,将创建一个跳转表,以包含处理的整数Case的整个范围。这允许Select Case As ConstSelect Case快。然而,值范围的大小受到限制,范围内的最大值可能不高于最小值+ 4096。

例子


Dim choice As Integer

Input "选择1到10之间的数字:"; choice

Select Case As Const choice
Case 1
    Print "数字是1"
Case 2
    Print "数字是2"
Case 3, 4
    Print "数字是3或4"
Case 5 To 10
    Print "数字在5到10的范围内"
Case Else
    Print "数字在1-10范围之外"
End Select


''选择CASE vs.选择CASE作为CONST速度测试

Const N = 50000000

Dim As Integer dummy = 0
Dim As Double t = Timer()

For i As Integer = 1 To N
    Select Case i
    Case 1, 3, 5, 7, 9
        dummy += 1
    Case 2, 4, 6, 8, 10
        dummy += 1
    Case 11 To 20
        dummy += 1
    Case 21 To 30
        dummy += 1
    Case 31
        dummy += 1
    Case 32
        dummy += 1
    Case 33
        dummy += 1
    Case Is >= 34
        dummy += 1
    Case Else
        Print "不能发生"
    End Select
Next

Print Using "SELECT CASE:##。###秒"; Timer() - t
t = Timer()

For i As Integer = 1 To N
    Select Case As Const i
    Case 1, 3, 5, 7, 9
        dummy += 1
    Case 2, 4, 6, 8, 10
        dummy += 1
    Case 11 To 20
        dummy += 1
    Case 21 To 30
        dummy += 1
    Case 31
        dummy += 1
    Case 32
        dummy += 1
    Case 33
        dummy += 1
    Case Else
        If( i >= 34 ) Then
            dummy += 1
        Else
            Print "不能发生"
        End If
    End Select
Next

Print Using "SELECT CASE AS CONST:##。### seconds"; Timer() - t
Sleep


与QB差别

  • QB中不存在选择Case作为Const
  • 在“expr1 TO expr2 ”案例中,即使expr1 高于原始表达式,QB总是会对两个表达式进行评估。

参考