恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

continueの挙動(MQL4)

[追記: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」がインクリメントされている)ことが確認できました^^。