● ステートメントリファレンス
if 〜 then 、else 、endif
条件分岐を行います。
if 計算式 then
if と then の間には、結果が真の場合は 0 以外、偽の場合は 0 になる計算式(条件式)を記述します。
if ステートメントは、then 以降の記述により、次の3つの形式に分かれます。
- 一つだけ処理
then の直後に改行しないでステートメントを記述した場合は、真の時にそのステートメントだけを処理します。偽の時は次の行に処理を移します。
if 条件式 then 処理
コロンで後ろに処理が続いていても、then 直後のステートメントしか実行しません。コロンは改行文字と同じ扱いなので、コロンで接合されている処理は「if ステートメントの次の行」と見なされます。
if 条件式 then 処理A : 処理B
真の場合 … 処理A 、処理B を実行
偽の場合 … 処理B を実行
プログラム全体を一行に繋げて使用する場合のために、直後のステートメントしか実行しない仕様にしてあります。この処理の流れ方は、C/C++の if ステートメント(中括弧を使用しない場合)に似ています。
参考:C/C++の場合
if (条件式) 処理A; 処理B; /* 真の場合は処理Aと処理B、偽の場合は処理Bのみ実行 */
真の時に複数行を実行したい場合や、一般的な BASIC に対する移植性をできるだけ確保しておきたい場合は、次の「処理ブロック」の記述法を用いてください。
|
- 処理ブロック
then 以降に改行文字やコロンを置いた場合は、その行以降に endif を記述する必要があります。
if 条件式 then
処理1
処理2
処理3
・
・
・
endif
if の行から endif までの間は、処理の纏まり(処理ブロック)として扱われます。この場合、条件式が真の時に処理ブロックが実行され、偽の時は endif までジャンプします。
endif 自体は何も処理を行わないので、goto等のジャンプで処理ブロック内に飛び込んでもエラーにはなりません。
- 真の場合の処理、偽の場合の処理
if と endif の間の行に else を記述すると、if 〜 else の間が真の時に実行される処理ブロック、else 〜 endif の間が偽の時に実行される処理ブロックとなります。
if 条件式 then
真の場合の処理ブロック
else
偽の場合の処理ブロック
endif
else 自体は、対応する endif までの無条件ジャンプを行います。この機能は if 〜 then を通さなくても動作します(ただし、記述上は if 〜 then 、endif が必要です)。
外から goto 等でブロックに飛び込んだ場合、そのブロックだけを処理します。
then の直後に else や endif を置く事はできません。置いた場合、STATUS_THEN_SYNTAXERROR が返されます。
エラーになる.
if 1 then else
if 1 then endif
then の後ろを改行すれば、次の行に else や endif を置く事ができます。
if x then
else
処理
endif
または、
if x then : else
処理
endif
この場合は、x が偽の時に処理が実行されます。
else と endif の場合も同様です。
if x then
処理
else
endif
この場合は、x が真の時に処理が実行されます。
処理ブロックの方法は基本的に改行させる必要があるので、一行に繋げて使用する場合は、次のように行毎に記述するステートメント全てをコロンで区切ります(if 〜 endif の間にある改行文字をコロンに置き換える)。
if 条件 then | : | 処理A | : | 処理B | : | 処理C | : | endif |
| ↑ | | ↑ | | ↑ | | ↑ |
|
|
if 条件 then :
処理A :
処理B :
処理C :
endif
|
if 条件 then | : | 真の場合の処理 | : | else | : | 偽の場合の処理 | : | endif |
| ↑ | | ↑ | | ↑ | | ↑ | |
|
|
if 条件 then :
真の場合の処理 :
else :
偽の場合の処理 :
endif
|
|
例外事項
- then 直後に $ がある時は、ラベル名が指定されたものと見なされます。その場合は、真の時に指定ラベルへジャンプします。偽の時は次の行へ処理を移します。
次の2つは等価です。
if 条件式 then $label
if 条件式 then goto $label
goto 等、ラベルしか指定しないステートメントでは $ を省略できますが、if の場合は then 以降にラベル以外が記述される可能性があるため、$ を省略できません。
$ を省略したい場合は then 以降に goto を使用してください。
× if 条件式 then label
〇 if 条件式 then goto label
|
- then 直後が注釈の場合は、真偽に関わらず処理を次の行に移します。
if 条件式 then rem 注釈文
if 条件式 then # 注釈文
正常動作時は、行全体を注釈にした時と同じく、条件分岐としては機能しない状態になりますが、条件式の評価は行われます。
# if 12 / 0 then goto $label エラーにならない
if 12 / 0 then # goto $label エラーになる
- then 以降に if が続いている場合は、連続している if 〜 then 全体が一つの条件分岐と見なされ、偽の時のジャンプ先を一番最後の if に合わせます。
if 条件1 then if 条件2 then if 条件3 then … if 条件n then 真の場合の処理
全ての条件が真の時に、後続の処理を実行します。一つでも偽だった場合は、次の行に処理を移します。
処理ブロックの場合も、同様の動作になります。
全て真の場合だけ、「真の場合の処理」を実行
if 条件1 then if 条件2 then if 条件3 then … if 条件n then
真の場合の処理
endif
全て真の場合は「真の場合の処理」を実行
何れかが偽の場合は「偽の場合の処理」を実行
if 条件1 then if 条件2 then if 条件3 then … if 条件n then
真の場合の処理
else
偽の場合の処理
endif
if ステートメントのネスト
if ステートメントは、アプリケーションが決定した限界数まで、入れ子にする事ができます。
if A then
if B then
・
・
・
endif
else
if C then
・
・
・
else
・
・
・
endif
endif
if 〜 then のネストは、処理ブロック内の if 〜 then が対象となります。then の後ろに if が連続する記述は、ネストと見なされません。