====== 条件分岐・繰り返し ====== [[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の条件式も文字列式である必要があります。\\ 乱数制御\\