====== 条件分岐・繰り返し ======
[[erabasicリファレンス|リファレンストップ]] · [[erabasicリファレンス_総索引|名前の総索引]]
条件分岐、繰り返し、ループの中断、ラベルへの移動を調べます。
===== 命令の説明 =====
==== BREAK ====
REPEATループやFOR,DO,WHILEの各ループの中にこの命令がある場合、ループを中断して、ループの終端命令(REND,NEXT,LOOP,WEND)の次の行に移動します。
==== CONTINUE ====
REPEATループやFORループの中にこの命令がある場合、ループ命令のところに戻ります。つまり、それ以降〜ループ終端命令までの部分を実行せずにカウンターを一つ進めるという処理になります。
==== IF系 ====
=== IF 条件 ===
* 分岐命令です。条件が真(成立する)ならば以下の命令を実行します。
=== ELSEIF 条件 ===
* 分岐命令です。必要ならばIF文とENDIF文の間に置かれます。条件が真(成立する)ならば以下の命令を実行します。
=== ELSE ===
* 分岐命令です。必要ならばIF文とENDIF文の間に置かれます。ELSE文以下の命令を実行します。なお、ELSEの後には別のELSEやELSEIFを置くことはできません。
=== ENDIF ===
* 分岐命令の終端を示します。IF文の後に必ず置かれます。
==== GOTO ラベル ====
ラベル名の次の箇所まで移動する命令です。ラベルがなければエラーを出します。関数を飛び越えての移動はできません。
==== REND ====
REPEATループの終端を表します。必ず必要です。
==== REPEAT 数値変数or数値 ====
ループ命令です。REPEATの後ろの数字の回数だけRENDとの間を回ります。なお、何度目のループか?というのは数値変数COUNT:0を見れば分ります。
==== SIF 条件 ====
分岐文です。条件が真(成立する)ならば直後の一行分の命令を実行します。IF文と違って、ENDIF文は不要ですし、ELSEやELSEIF文による分岐はできません。
==== FOR <数値型変数>, <数式>, <数式>{, <数式>}\\ NEXT ====
FOR〜NEXTはREPEAT〜RENDの機能強化版です。\\
第1引数はカウントに使用される変数を表します(REPEATでは常にCOUNT:0)。\\
第2引数は変数に最初に代入される値を表します(REPEATでは常に0)。\\
第3引数はループが終了される値を表します(REPEATで設定可能な値)。\\
第4引数はループごとに加算される値を表します(REPEATでは常に1)。\\
FOR COUNT, 0, X
〜〜
NEXT
REPEAT X
〜〜
REND
上の二つはほぼ同じ動作をします。\\
ともにX回の繰り返しを行う構文で、ループの途中でCONTINUEやBREAKを使用できます。\\
異なる点はカウント用の変数を指定できることと、開始値とステップを変更できることです。\\
また、FOR〜NEXTは入れ子にすることができます。\\
FOR Y, 0, 100
FOR X, 0, 100
〜〜
NEXT
NEXT
第1引数である<変数名>に指定できる変数は数値型の変数のみです。キャラクタ変数も使えません。\\
第4引数である<ステップ>は省略可能です。省略した場合、1です。\\
<ステップ>が正の値のとき、繰り返しのたびに<変数名>の変数に<ステップ>が加算され、第3引数<終了値>以上となったときにループが終了します。\\
<ステップ>が負の値のときは、<変数名>の変数が<終了値>以下となったときにループが終了します。\\
<ステップ>が0であれば無限ループになります。BREAK文が実行されるまで永久に繰り返します。\\
各値はループの開始と同時に固定され、ループの途中で変数が変化しても影響を受けません。\\
以下の2つは同じ結果になります。\\
;1
X = 10
FOR COUNT:X, 0, X, X/10
X = 10000
NEXT
;2
FOR COUNT:10, 0, 10, 10/10
X = 10000
NEXT
なお、GOTO等の命令で直接FOR〜NEXT内に入った場合、REPEAT〜RENDと同様にNEXTの直前まで通常通り実行し、その後NEXTを無視して次の行から処理を続行します。\\
==== WHILE <数式>\\ WEND ====
REPEAT〜RENDやFOR〜NEXTのような繰り返し構文の一種です。\\
WHILEの<数式>が0以外である限りループを繰り返します。\\
常に満たし続ける条件を与えると、BREAKで抜けるようになっていない限り無限ループになります\\
あまりにループ処理が長いとEmueraが文句を言う場合があります\\
なお、GOTO等の命令で直接WHILE〜WEND内に入った場合、通常どおりWENDに到達した時点でWHILEへループし、条件を判定します。\\
==== DO\\ LOOP <数式> ====
REPEAT〜RENDやFOR〜NEXTのような繰り返し構文の一種です。\\
Cのdo〜while、VBのdo〜loop while構文と同様、LOOPの<数式>が0以外である限り実行をループを繰り返します。\\
WHILE〜WENDと異なり最低でも1回は実行されることが特徴です。\\
なお、DO〜LOOP内のCONTINUEした場合にはLOOPの条件を満たしていなければそのままLOOPを抜けます。CONTINUEしてもDO文に戻るとは限らないことに注意してください。\\
また、GOTO等の命令で直接DO〜LOOP内に入った場合、通常どおりLOOPに到達した時点で条件を判定し、<数式>が0以外ならDOへループします。\\
==== SELECTCASE <式>\\ CASE (, , ……)\\ CASEELSE\\ ENDSELECT ====
分岐構文です。Visual Basicの同名の構文と動作を似せています。\\
IF構文と似ていますが、SELECTCASEは1つの値を元に複数の行へ分岐する構文です。\\
SELECTCASEに指定した引数の値によって分岐します。 もっとも単純な使用法は以下のようになります。\\
SELECTCASE X
CASE 1
PRINTL Xは1です。
CASE 3
PRINTL Xは3です。
CASEELSE
PRINTL Xは1でも3でもありません。
ENDSELECT
このスクリプトはXの値によって分岐します。\\
SELECTCASE文が実行された時、Xが1であれば"CASE 1"の行に飛び、次のCASEまたはCASEELSEまでの行を実行します。\\
同様にXが3であれば"CASE 3"に飛びます。\\
Xの値に対応するCASE文がない時、CASEELSE文があればそこに飛びます。なければENDSELECTに飛びます。\\
Cなどのswitch文と異なり、1つのCASEから次のCASEに流れ落ちることはありません。\\
また、BREAK文でENDSELECTに飛ぶことはできません。\\
なお、GOTO等の命令で直接SELECTCASE〜CASE〜CASEELSE〜ENDSELECT内に入った場合、IF〜ELSEIF〜ELSE〜ENDIFと同様に\\
CASE、CASEELSE、ENDSELECTの直前まで通常通り実行したあとに、ENDSELECTの次の行へ飛び処理を続行します。\\
CASEの条件式には3種類の書式があります。\\
1つは上記のように値を直接指定する方法、2つ目は"IS <演算子> <数式>"、3つめは"<数式> TO <数式>"です。\\
"IS <演算子> <数式>"の場合、例えば"IS <= 30"であればXが30以下の場合、CASE以下が実行されます。\\
"<数式> TO <数式>"の場合、例えば"10 TO 20"であればXが10以上20以下の場合、CASE以下が実行されます。\\
また、CASEには複数の条件式をカンマで区切って指定することができます。\\
これらを利用して例えば以下のように書くことができます。\\
SELECTCASE X
CASE 1
PRINTL Xは1です。
CASE 2,3
PRINTL Xは1ではありません。
PRINTL Xは2か3です。
CASE 10 TO 20
PRINTL Xは1でも2でも3でもありません。
PRINTL Xは10以上20以下です。
CASE IS <= 30
PRINTL Xは1, 2, 3, 10以上20以下のどれでもありません。
PRINTL Xは30以下です。
CASE 40, 5 * 10 TO 6 * 10, IS >= 10 * 10
PRINTL Xは30以下ではありません。
PRINTL Xは40, 50以上60以下, 100以上のいずれかです。
CASEELSE
PRINTL Xは30以下, 40, 50以上60以下, 100以上のいずれにも該当しません。
ENDSELECT
ISやTOは"IS <演算子> <数式>"、"<数式> TO <数式>"の形で使わねばならないことに注意してください。\\
例えば"30 < IS"や"(10 TO 20) || (30 TO 40)"のような書き方はできません。\\
また、"<数式> TO <数式>"はあくまでも左辺以上、右辺以下の場合に真となります。\\
右辺が左辺より小さい場合はそのCASEが実行されることはありません。\\
1つのCASEに複数の条件式がある場合、短絡評価が起きることに注意してください。\\
条件は左から順にチェックされ、条件を満たすものが見つかった場合、残りの条件は評価されません。\\
SELECTCASEの引数として文字列式を使用することもできます。\\
SELECTCASEに文字列を指定した場合はCASEの条件式も文字列式である必要があります。\\
乱数制御\\