条件文ブロック
構文:
Select Case expression
[ Case expressionlist]
[statements]
[
Case Else ]
[statements]
End Select
または
Select Case As Const integer_expression
[ Case constant | enumeration ]
[ statements ]
[ Case Else ]
[ statements ]
End Select
記述:
Select Case は、式の値に従って、特定のコードを実行します。
式は、一度評価されて、各 Case と比較します。順番に照合して、式の値と合致するものを見つけます。
合致したケース分岐の内側のコードが、実行されます。そして、プログラムは Select Case ブロックの最後の端までスキップします。
Case Else は、これまでに合わなかった、残りのケース合致します。このため、Case Else を入れておけば、少なくとも1つの Case が実行されることが、保証されます。
どの Case も合致しないと、Select Case ブロック全体が、スキップされます。
End Select は、Select Case...End Select ブックを閉じるのに使います。
Exit Select を使って、Select Case ブロックから脱け出て、Case ブロック内のそれ以降のコードが実行されないようにできます。
C ユーザへの注意:
FreeBASIC では、Select Case は、すべてのケースについて、最後に break をとる、switch ブロックのように作動します。
不成立にならないように、複数のオプションは、一つの 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 (=, >, <, <>, <=, >=)を使います
比較が true なら、照合は完了です。
各 Case で、値をコンマ (,) で切り離すことによって、複数の値をチェックをすることができます。
いったん合致を見つけると、プログラムは、チェックを終えて、その Case のブロックのコード命令文に、実行を移します。
更なる式は、評価されませんし、チェックもされません。
式リストの例:
Case 1 | 定数 |
Case 5.4 To 10.1 | 範囲 |
Case Is > 3 | より大きい、より小さい |
Case 1, 3, 5, 7 to 9 | 値のセットに対して合致します |
Case x | 変数の値 |
As Const が使われるならば、値を求めることができるのは整数定数だけ(2つの浮動小数点定数(single と double) を除くすべての数の定数)で、式リストは、単純な定数と列挙だけをサポートします。
"To" 範囲は、サポートされます。しかし、"Is" 関係演算子は、サポートされません。
As Const を使うと、ジャンプ・テーブルは、処理される整数の Case の全範囲を含むように作られます。
このため、Select Case As Const は Select Case よりも速くなります。
ただし、値の範囲のサイズには制限があり、値を uinteger 型に変換した後は、範囲の最大値は、最小値 +8191 以下になる可能性があります(現在の実装)。
注意:
Select Case 命令文と最初の Case 命令文の間に命令文を配置することはできません。
例:
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 speed test
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" の場合、QB は両方の式を、いつも評価します。expr1 がオリジナルの式より大きい場合にでもです。
-
-lang qb および -lang fblite 方言では、Select..End Select ブロック内で宣言された変数は、QB のように関数全体の scope を持ちます。
-
-lang fb および -lang deprecated 方言では、Select..End Select ブロック内で宣言された変数は、ブロック内でのみ表示され、ブロック外からはアクセスできません。
このブロックの外側でグローバルとして定義された重複シンボルにアクセスするには、プレフィックスとして 1つまたはできれば 2つの点を追加します:.SomeSymbol またはできれば ..SomeSymbol ( With..End With ブロック内の場合は ..SomeSymbolのみ)。
参照: