【超入門】MQL5 EA講座 第41回「breakとcontinue」

MQL5でEA作ろう講座

前回for文について解説しました。

改めて前回の内容をおさらいをしておくと、

  • for文は、()内のループ継続条件の記述が(1) ループの始点を記述するセクション(2)ループの終点を記述するセクション(3) {}内処理終了ごとの処理を記述するセクション の3つのセクションに分かれる。

  • for文の()内のセクション1~3の記述は、省略することも可能。(ただし特殊な記述である事、無限ループが発生する可能性があることに留意する)

  • for文の()内のセクション1とセクション3に複数の変数を設置することも可能(ただし特殊な記述である事、無限ループが発生する可能性があることに留意する)

ということをお伝えしました。

今回はbreak演算子continue演算子 についてお話ししたいと思います。

スポンサーリンク
スポンサーリンク

break演算子とは?

break演算子については、

第37回「switch文」のところでも、少しだけ登場し軽く触れました。↓

あたらめて説明すると、break演算子

条件演算や繰り返し構文で使われる{}内の処理を途中で離脱する為に使われるものです。

「条件演算子って何だったっけ?」という方は、↓の記事群をご覧ください

「繰り返し構文ってなんだったっけ?」という方は、↓の記事群をご覧ください。

プログラムがbreak演算子に行き着くと、プログラムは最後まで{}内の記述を読み込まず、途中で直近の{}内を抜け出ます。

void OnStart()
  {

   for(int icounter=0;icounter<=5;icounter++)
     {
     
     //icounterが3だったら、for文のループを抜ける
      if(icounter==3)break;
      
      //0,1,2がログ出力される
      Print(icounter);

     }

  }

for文の()内に記述されているループ継続条件は

0から5まで です。

したがって、

if(icounter==3)break;//icounterが3だったら、for文のループを抜ける

という記述がなければ、本来Print関数によるログ出力は0,1,2,3,4,5となる筈です。

しかし、icounterの値が3のループ時、break演算子の箇所で{}を離脱しているために、それ以降のログ出力は行われず、最終的なログ出力結果は「0,1,2」となっています。

while文や、do-while文for文などの繰り返し構文の解説記事の中で

記述内容に気を付けないと、無限ループとなる危険性がある

ということを書いてきましたが、

繰り返し構文の()内に記述するループ継続条件は設定せず、無限ループ状態にしつつも、{}内でbreak演算子を使うことによって、無限ループにせずに特定条件下でループを終了させる記述が可能です。↓

void OnStart()
  {   
     
     //ループカウント用の整数型変数「counter」を用意
     int icounter=1;
     
     //()内にループ継続条件は指定しない
     for (;;)
     {
         //ログ出力
         Print(icounter);//1,2,3,4,5が出力される
         
         //icounterが5だったら、for文のループを抜ける
         if(icounter==5)break;
         icounter++;
     }
     
     
  }

for文の()内にループ継続条件は指定していないので、{}内にbreak演算子を入れることによって、

icounterが5だったら、for文のループを抜ける

という無限ループにならずに、ループ離脱する記述となりました。

補足 -break演算子の離脱範囲について-

switch文の解説記事の時にも書いたことなのですが、大事なことなので改めて書きます。

break演算子をもちいて離脱する{}はあくまで、break演算子が用いられた直近の{}だけです。

例えば↓

void OnStart()
  {   
     
     
     //メインループ
     for (int icounter=0;icounter<=5;icounter++)
     {
         //サブループ
         for(int jcounter=0;jcounter<=5;jcounter++)
         {
               //ログ出力
               Print("サブループ=",jcounter);//0,1,2が出力される
               if(jcounter==2)break;
              
         }
         //ログ出力
         Print("メインループ=",icounter);//0,1,2,3,4,5が出力される
     }
     
     
  }

上記のコードを見るとfor文の中にfor文が入っている入れ子状の構造(ネスト)になっています。

外側のメインループのループ回数を決定する変数が「icounter」

内側のサブループループ回数を決定する変数が「jcounter」

となっています。どちらも()内で定義しているループ範囲は0~3

icounterが「0」のときにjcounterが「0,1,2」とループ処理をしていき、jcounterが「2」までいったらicounterが「1」になって、再度jcounterが「0,1,2・・・」と再度ループ処理をする

そんな構造になっています。

icounter=0 jcounter=0

icounter=0 jcounter=1

icounter=0 jcounter=2

icounter=0 jcounter=3

icounter=1 jcounter=0

icounter=1 jcounter=1

icounter=1 jcounter=2

icounter=1 jcounter=3

・・・・以下略。

こんな感じで処理が行われていきます。・・・本来であれば

サンプルコードではサブループの部分に

if(jcounter==3)break;

という処理文を入れています。「jcounterの値が2になったらループを抜ける」という意味ですね。

このプログラムを実行すると以下のようになります。↓

「jcounterの値が2になったらループを抜ける」というbreak演算子の使い方をしているので、サブループのログ出力は「2」までしか表示されていない一方で、ループを抜けたのはあくまで内側のサブループfor文の{}です。

メインループのfor文には、break演算子の記述はないので、メインループはループが「3」まで継続している、というのがわかると思います。

continue演算子とは?

continue演算子は、break演算子と似たような役割を果たすのですが、

break演算子がループを完全に離脱し、以降のループを行わないのに対し、

continue演算子は特定の条件になったらスキップして次のループに移る

という挙動の違いがあります。

言葉だけではわかりづらいと思うのでコードで見てみましょう。

void OnStart()
  {   
     
     int icounter=0;
     
     //icounterの値が5より小さいか、5と同じまでループする
     while (icounter<=5)
     {
       
       //インクリメント(icounterの値に1プラスする)
         icounter++;
         
         //icounterの値が3の時は処理をスキップする
        if(icounter==3)continue;
        //ログ出力
        Print(icounter);//1,2,4,5,6 が出力される
     }
     
     
  }

順番に見ていきましょう。ループ継続条件は

while (icounter<=5)すなわち、

「icounterの値が5より小さいか、5と同じまで」

となっています。

{}内にてicounterの値をインクリメント(icounterの値に1プラスする)させ、その上でPrint関数にてicounterの値をログ出力する、という記述なのですが、

if(icounter==3)continue;

という記述によって、

icounterの値が3の時はcontinue演算子より下に書かれている{}内処理をおこなわず、whileループの最初に戻る

ということを意味しています。

whileループの最初に戻った後は、再び{}内冒頭のインクリメント記述によってicounterの値が4となり(=3でなくなり)、再びログ出力が開始される、という流れです。

ログ出力の結果は、「1,2,4,5,6」となります。

ちなみに、なぜ出力結果に「6」が含まれているのか、については大丈夫でしょうか?

icounterの値が5の時→まだ{}内のループは読み込む

{}冒頭のインクリメントによってicounterの値が6になる

{}内のPrint関数が発動し、「6」をログ出力

icounter=6なので、ループは終了

このような流れになっています。

まとめ

今回はbreak演算子continue演算子について解説しました。

今回の記事では以下のことを学びました

  • break演算子は、条件演算や繰り返し構文で使われる{}内の処理を途中で離脱する為に使う。

  • continue演算子は特定の条件になったらスキップして次のループに移る動作をさせたい時に使う

今回は以上になります。

最後までお読みいただきありがとうございました<m(__)m>

【超入門】MQL5 EA講座 第40回「for文について」【EAの作り方】

【超入門】MQL5 EA講座 第42回「return演算子について」【EAの作り方】

コメント

タイトルとURLをコピーしました