[追記:2020/08/07]
C言語での実験結果(for文中のcontinue)を本記事末尾に追記しました。
今更ながら初歩的なことを確認してみました。
MQLのcontinueの挙動です。
for文の中でcontinueを使った場合、continueより後ろに続くコードは処理されずfor文の先頭に処理が移りますよね。この時、ループ回数を制御するカウンタは回る(インクリメントまたはデクリメントされる)と思っていたのですが、「この理解で合ってるよね?」と確認したくなったのです。
そこで、コードを書いて実験してみました。以下の実験結果に登場する「i」はfor文のループ回数を制御しているカウンタです。そして「CONTINUE!」という行はcontinueが実行されたことを示しています。
for文の先頭 iの値は: 999 CONTINUE! for文の先頭 iの値は: 998 CONTINUE! for文の先頭 iの値は: 997 CONTINUE! for文の先頭 iの値は: 996 CONTINUE! for文の先頭 iの値は: 995
この結果を見ると、for文ではループ回数を制御するカウンタが回っていますね。
では、、、while文やdo-while文ではどうなるのでしょうか?
for文と違ってインクリメント部(デクリメント部)が存在しないので、コード作成者が意図的にカウンタを回さないと無限ループに陥る気がします。
以下のMQLスクリプトを実行してみました。
void OnStart() { int i = 1; do { printf("iの値は: %d",i); if(i % 2 == 0) continue; printf("奇数"); i++; } while (i < 50); }
実行結果
iの値は: 1 奇数 iの値は: 2 iの値は: 2 iの値は: 2 iの値は: 2 iの値は: 2 iの値は: 2 (以下略)
予想通り無限ループ状態になりました(コードから見て当たり前ですが)。
continueの直前でループ条件に関わる変数「i」をインクリメントしておく必要がありますね。
if文部分を以下のように変更します。
if(i % 2 == 0) { i++; continue; }
このコードを実行すると以下のログが出力されました。
iの値は: 1 奇数 iの値は: 2 iの値は: 3 奇数 iの値は: 4 iの値は: 5 奇数 iの値は: 6 iの値は: 7 奇数 iの値は: 8 iの値は: 9 奇数 iの値は: 10 iの値は: 11 奇数
(以下略)
これなら問題ないですね。
C言語ではどうなるか?(for文中のcontinue)
for文中のcontinueの挙動について、C言語でも実験をしました。
コードは以下のとおりです。
#include <stdio.h> int main(void) { int i = 1; for (i = 1; i <= 10; i++) { printf("iの値は: %d\n", i); if (!(i % 2)) { printf("CONTINUE!\n"); continue; } printf("奇数!\n"); } return 0; }
コードの実行結果
iの値は: 1 奇数! iの値は: 2 CONTINUE! iの値は: 3 奇数! iの値は: 4 CONTINUE! iの値は: 5 奇数! iの値は: 6 CONTINUE! iの値は: 7 奇数! iの値は: 8 CONTINUE! iの値は: 9 奇数! iの値は: 10 CONTINUE!
continueした際、ちゃんとインクリメント部が実行されている(変数「i」がインクリメントされている)ことが確認できました^^。