アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB6です。
For文の終了値が関数になっている場合、この関数の評価はFor文を実行する最初に1回しか行われない(関数は1度しか呼ばれない)ということがVBの規約か何かどこかで明記されているでしょうか。

例)
For i = 0 To Func(i)
(処理)
Next

Function Func(i as integer) as integer
Func = i + 1
End Function

という風に記述した場合、(処理)が2回実行されるてループを抜けることが確認できました。これはi=0のときに関数Funcを一回だけ実行しているということです。(デバッグモードでそれを確認)

これは、規定の動作なのかそれともたまたまなのでしょうか。
上記のFor文でもし毎回Funcが評価されると無限ループになってしまいます。

A 回答 (2件)

興味深い話なので調べてみました。


ヘルプの「For...Next ステートメント」には、
「プログラムの実行がループに移り、ループ内の一連のステートメントがすべて実行されると、step の値が counter に加算されます。この時点で終了条件が満たされていない場合は、ループ内のステートメントが再び実行されます。」
とあります。
つまり、For文の終了値は、ループ前の1回目にだけ評価されて内部的にその値が保存され、2回目のループを始める際の終了条件の評価としてはその保存値が使われるのだと、深読みしてできないことはないと思います。
そのような解釈で納得されてはいかがでしょうか。
そもそも、終了条件がループの中で変わるような繰り返し処理にはDo...Loopステートメントを使うのが一般的であって、For...Nextステートメントを使うべきではないと思います。
もちろん、そのような事は承知の上での疑問だとは思いますし、僕も実際興味を持ちました。
頑張ってくださいヽ(^。^)ノ
    • good
    • 0

式の評価は最初の一回だけですよ。


VBの文法書(F1キーを押したときに出るマニュアル)
にはそのような記述は見あたりませんが、昔からそうです。たまたまではありません。

昔は、マイクロソフトBasic の他に、
N-Basic , F-Basic 等があったのです。
今後もし、他のBasic (そんなものは今後もなさそう)
に移植(昔はよくあった)することを考えると、

上記の部分で誤動作するので、終了値を関数にするのは
やめた方がいいと言うくらいですね。
わかりにくいですし・・・ね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています