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, и программа пропускает все остальные Case вплоть до конца блока Select Case. Выражение Case Else является условием по умолчанию, когда ни один Case не сопоставлен. Так что, если есть Case Else, то это гарантирует что хотя бы один блок выполнится. Если ни один Case не совпадает, то будет пропущен весь блок Select Case.

End Select используется для закрытия блока Select Case...End Select.

Примечание для пользователей C: В FreeBASIC, Select Case работает как блок switch , где все условия имеют оператор break в конце. Так же многократные варианты могут быть помещены в список выражения на одном Case.

Помимо типов integer, типы с плавающей запятой и выражения последовательности поддерживаются в первом синтаксисе.

Синтаксис списка выражения:
{ expression | expression To expression | Is relational operator expression }[, ...]

  • expr: оценивается expr, и сравнивается на равенство с исходным выражением. Если они равны, то совпадение найдено. Это может рассматриваться как сокращение для "Is = expr" (см. ниже).
  • expr1 To expr2: оценивается expr1 и проверяется его на предмет меньше или равно исходному выражению. Если это так, он оценивает expr2, и проверяет его на предмет больше или равно исходному выражению. Если это так, то совпадение было найдено.
  • Is реляционный_оператор expr: оценивается expr, и сравнивает исходную операцию с помощью прилагаемого реляционного_оператора (=, >, <, <>, <=, >=). Если сравнение имеет значение true, то найдено совпадение.

Несколько проверок могут быть сделаны в каждом Case, разделяя их запятой (,). Как только совпадение было найдено, программа заканчивает свою проверку и идет на выполнение инструкций кода для этого блока Case. Никакие дальнейшие выражения не вычисляются и не проверяются.

Пример списка выражений:
Case 1 константа
Case 5.4 To 10.1 диапазон
Case Is > 3больше, чем 3
Case 1, 3, 5, 7 to 9 набор значений
Case x значение переменной


Если As Const используется, только integer константы (все числовые константы исключая константы с плавающей точкой: single и double) могут быть оценены , а список выражений поддерживает только простые константы и перечисления. "To" для диапазонов поддерживается, но "Is" не поддерживается.

С использованием As Const, таблица переходов создается, чтобы содержать полный спектр integer хендлов Case. Это позволяет Select Case As Const работать быстрее чем простому Select Case. Тем не менее, размер диапазона значений ограничен, и наибольшее значение в диапазоне может быть не больше, чем наименьшее значение + 4096.

Пример


Dim choice As Integer

Input "Choose a number between 1 and 10: "; choice

Select Case As Const choice
Case 1
    Print "number is 1"
Case 2
    Print "number is 2"
Case 3, 4
    Print "number is 3 or 4"
Case 5 To 10
    Print "number is in the range of 5 to 10"
Case Else
    Print "number is outside the 1-10 range"
End Select


'' SELECT CASE vs. SELECT CASE AS 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 "can't happen"
    End Select
Next

Print Using "SELECT CASE: ##.### seconds"; 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 "can't happen"
        End If
    End Select
Next

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


Отличия от QB

  • Select Case As Const не существует в QB
  • В "expr1 TO expr2" case, QB всегда будет оценивать оба выражения, даже если expr1 был выше, чем исходное выражение.

См. также