パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
FORループの落とし穴 (準備中)
10 J=10
20 for I=0 to J
30 J=J-1
35 PRINT "I:";I;" J:";J
40 NEXT
45 PRINT "ループ終了"
50 PRINT "I:";I;" J:";J
これはよく指摘される問題ですが、上のプログラムにはFOR...NEXTのループ文の仕様をかっちりおさええてないと、
やってしまいがちな落とし穴があります。
FORループの終わり値にはJが指定されています。
そうすると、終わり値は10になるのか、
それともループの中でJの値は1づつ減少しているので終わり値はループをまわるごとに減少していくのか
という問題にぶちあたります。
後者だとすると、I=5の時点(その「時にJ=4になっている)でループを抜けることになります。
F-BASICのマニュアル(文法書)とN-88BASICのマニュアル(文法書)をひっくり返してみてみましたが、
終わり値に関しては明確な記載がありませんでした。
(→文法書にはっきり記載がないのが、落とし穴にはまる根本的な原因か
なんだか、レベル30くらいにはなって、じゃそろそろファーストレベルのダンジョンで最後のボスキャラ
倒しに行くか〜と勇んで戦いにいってみたところ、なんかすごい技を繰り出してきて、そんな技使ってくるとは
聞いてないよう〜みたいな、落とし穴ですね)
FORループについてはBASIC超基本1で簡単に説明していますが、そこでもFOR文に関する
大事な仕様には触れていなかったので、ここでおさらいいたします。
FOR文の重要な仕様として
@ 初期値はNEXTを通過するときに増加する。
A 終値は初めてFORループに入る時に設定され、以後は変化しない。
という2点があります。
この仕様は上記のプログラムを実行して、変数IとJの値を見てみるとはっきりと確認できます。
以下、N88互換BSIC for Winで実行した画面です。
一目瞭然なので説明不要ですね。
上記の仕様がきっちり理解できていれば、
FOR...NEXRループからGOTO文で抜け出すという禁じ手もどういう挙動になるか
わかるはずです。
10 J=10
20 for I=0 to J
30 J=J-1
35 PRINT "I:";I;" J:";J
36 IF I=5 THEN GOTO 45
40 NEXT
45 PRINT "ループ終了"
50 PRINT "I:";I;" J:";J
これを実行したところ(N88互換Basic for Win)
Basicの文法書にはFORループからGOTO文で抜け出してはいけないと書かれていたりしますが、
仕様をわかった上で抜け出すなら、それもありでしょう。
(参照)
なお、Forループにgoto文でループの外から飛び込むという、更におきて破りの実験を
やってみたことがあります。プログラム言語により多少違った結果になります。
goto文でループに飛び込むという魔王クラスの悪魔(トリッキー)コード