【超入門】MQL5 EA講座 第37回「switch文」【EAの作り方】

MQL5でEA作ろう講座

—————————————————————

前回は 三項演算子(ternary operator) について解説しました。

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

  • 最初のセクションでは、条件文(「正しい(true)か 「正しくない(false)」かを判定する値・算式)を記述する。

  • その際、最初に条件判定に使う値、もしくは算式を書き、その右にクエスチョンマーク(?)を記述する

  • 2つ目のセクションでは、最初のセクションで記述した条件文が「正しい(true)」だった場合の実行内容を記述する。

  • その際、実行内容の記述が終わったら、コロン(:)で区切りを入れる。

  • 最後のセクションでは、最初のセクションで記述した条件文が「正しくない(false)」だった場合の実行内容を記述する。

  • 三項演算子(ternary operator)のメリットは、ifelse文に比べて記述するボリュームを少なくできることだが、言い換えればifelse文でも同じ処理をする記述ができるということなので、無理して使う必要はない。

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

今回は switch文 についてお話ししたいと思います。

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

switch文とは?

switch文は、

if文 や else文

三項演算子(ternary operator)

と同様に、条件演算子(~したら・・・する、という条件と処理を担う記述群)の1つになります。

switch文の作り方

switch文を作るには、

switch

という演算子と

case

という演算子を用います。

switch演算子とは?

switch演算子は、後述する、case演算子が構成する定数リストと比較する値を指定するのに使います。(今はなにをいっているかわからなくても大丈夫です)

定数については↓の記事をご参照ください。

case演算子とは?

case演算子は、switch演算子が指定する値と比較する定数リストを構成するのに使います。(これも、今はなにをいっているかわからなくても大丈夫です)

switch文では、switch演算子が指定する値と、case演算子の構成する定数リストの各値を比較して、その2つの値が等しい(true)か、等しくない(false)かの条件判定を行います。

条件判定がtrueの時に、処理文に書かれている記述内容を実行します。

true,falseなどの真偽値についてはコチラ

定数についてはコチラ


void OnStart()
  {   //int型の変数varIntを宣言し、1を代入
      int varInt=1;
      
      //変数varIntを定数リストと比較する値に指定
      switch (varInt)
      {  
         //varIntの値が1の場合
         case 1:
         //ログ出力
         Print("varInt=1");
         //switch文を抜ける
         break;
         
         //varIntの値が2の場合
         case 2:
         //ログ出力
         Print("varInt=2");
         //switch文を抜ける
         break;
         
         //varIntの値が3の場合
         case 3:
         //ログ出力
         Print("varInt=3");
         //switch文を抜ける
         break;
         
         //varIntの値が、caseで指定した定数リストの値のどれでもない場合。
         default:
         //ログ出力
          Print("どの値でもありません");
      }
  }
//+------------------------------------------------------------------+

まず、int型の変数varIntを宣言し、1を代入しました。

今回はこのvarIntに入っている値を、case演算子で構成する定数リストの値と比較する対象とします。

そのために、

switch演算子を記述した後、()内にint型の変数「varInt」を入力しました。

//変数varIntを定数リストと比較する値に指定
      switch (varInt)

↑の記述をした後は、

{}

の中に、

case演算子で構成する定数リストの値

を記述していきます。

 {  
         //varIntの値が1の場合
         case 1:
         //ログ出力
         Print("varInt=1");
         //switch文を抜ける
         break;
         
         //varIntの値が2の場合
         case 2:
         //ログ出力
         Print("varInt=2");
         //switch文を抜ける
         break;
         
         //varIntの値が3の場合
         case 3:
         //ログ出力
         Print("varInt=3");
         //switch文を抜ける
         break;


case 1:

という記述は

varIntの値が1の場合

という意味になります。if文に置き換えると、↓

if(varInt==1)

という書き方になります。

条件演算子なので、if文ternary構文(三項演算子)と置き換え可能という訳です。

case演算子→比較する定数値→コロン

//varIntの値が1の場合
         case 1:

の順に記述していきます。

switch演算子で指定した値と、case演算子で指定した定数値が等しければ、処理実行記述に移ります。

処理実行記述はサンプルコードで言うと、

//ログ出力
Print(“varInt=1”);

の部分ですね。

varIntの値には 1 が格納されているので、条件は合致し

Print(“varInt=1”)が実行されます。

//varIntの値が1の場合
         case 1:
//Print関数を発動させ、"varInt=1"とログ出力する
         Print("varInt=1");

break演算子について

Print(“varInt=1”);

の下を見ると、

break;

という記述がみられますね。

これはbreak演算子というキーワードで、

このbreak演算子を使うと、プログラムは直近の{}内を抜け、それ以降に記述されている{}内の処理はおこないません。

(break演算子については、第41回「breakとcontinue」で、1つの項目として解説しておりますので、「先に詳しく知りたい」という方はリンク先をクリックして、ご覧ください)

swtitch
{ //varIntの値が1の場合
         case 1:
//Print関数を発動させ、"varInt=1"とログ出力する
         Print("varInt=1");
        
  //break演算子によってswitchの{}を抜けるので、break演算子より下の記述は読み込まない
   break;
}

varInt==case 1を満たしているので、

Print(“varInt=1”);という処理を行った後は、その下の

case 2:

case 3:

の記述はもう読み込みません。

break演算子によって、switch文の{}を離脱しているからです。

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

今回のサンプルコードで言えば、switch文の{}は離脱しているけれども、OnStart関数の{}まで離脱しているわけではないという事です。↓


void OnStart()
  {   
      switch ()
      { 
      break;
      }//switch 文の{}処理を抜ける

  }//OnStart()の{}処理を抜ける訳ではない!
//+------------------------------------------------------------------+

という感じですね。

続いて、

switch文の{}内の最後に書かれている

default演算子

についてです。

default演算子について

default演算子というのは、

switch演算子で指定した値が、case演算子で指定した定数リストの値のどれとも一致しない場合に実行する処理を指定する演算子

です。

if文の条件文が正しくない場合、発動するelse文と同じ働きになります。

 //varIntの値が、caseで指定した定数リストの値のどれでもない場合。
         default:
         //ログ出力
          Print("どの値でもありません");

例えば、

varIntに代入されている値が「4」だった場合、

case演算子指定している1-3のどれとも一致しないので、その場合は

default:

の後に記述されている

Print(“どの値でもありません”);

が実行される、という流れです。

ちなみにdefault演算子

必ずしも、switch文において設置しなければいけないものでもありません。

switch演算子で指定した値が、case演算子で指定した定数リストの値のどれとも一致しない場合に、実行したい処理がなければ設置しなくてもコンパイルエラーにはなりません。

これまでに説明してきた、switch文の構造をまとめると以下のようになります。↓

switch(条件判定に用いる値)
{
   case定数値A:
     条件一致時の実行文
     break;
   
    case定数値B:
     条件一致時の実行文
     break;

    case定数値C:
     条件一致時の実行文
     break;
 ・・・ 
 ・・・以下、必要な定数リスト~実行文の記述を用意

      default:
       どの定数リスト値にも合致しない時の実行文
}

switch文をOR条件(論理和条件)的に記述する場合

OR条件(論理和条件)というのは講座記事の第33回でも書きましたが、

「もし~、または・・・だったら」

といった具合に

「指定したの条件のうち、最低1つを満たしている」条件

のことを言います。詳しくは↓の記事をご覧ください。

if文で表すと↓のような感じになるのですが、

if(varInt==1 ||varInt==2 || varInt==1)
{
 Print("varInt=1 or 2 or3");
}

これをswitch文で記述しようとするとどうなるでしょうか?↓


void OnStart()
  {   //int型の変数varIntを宣言し、1を代入
      int varInt=1;
      
      //変数varIntを定数リストと比較する値に指定
      switch (varInt)
      {  
      
       
         //varIntの値が1か、2か、3の場合
         case 1:
         
         case 2:
         
         case 3:
         //ログ出力
         Print("varInt=1 or 2 or3");
         //switch文を抜ける
         break;
         
         //varIntの値が、caseで指定した定数リストの値のどれでもない場合。
        default:
         //ログ出力
          Print("どの値でもありません");
          
          //switch文を抜ける
         break;
      }
  }
//+------------------------------------------------------------------+

注目してほしいのは

case 1:

case 2:

の部分です。

先ほどまで存在していた

Print関数の実行文や、break演算子がなくなっています。

break演算子が登場するのは、

case 3:

になってからになるのですが、このような記述をすることによって、switch文を使ったOR条件記述が実現します。

switch文case演算子が指定する定数リストの値と一致しない場合、break演算子と遭遇するまで、一致する値を残りの定数リストから探しつづける性質を持っています。

サンプルコードで説明すると以下のような形です。↓


         
         case 1://実行文もbreakもないので、順次進行で「case 2:」の読み取りへ
         ↓
         case 2://実行文もbreakもないので、順次進行で「case 3:」の読み取りへ
         
         case 3://break があるので、「1-3」か「それ以外」かを判定する
        
     //「1-3」ならログ出力
         Print("varInt=1 or 2 or3");
         //「1-3」かswitch文を抜ける。「それ以外」ならdefault:~に進む。
         break;
         
      default:
         //ログ出力
          Print("どの値でもありません");
          
          //switch文を抜ける
         break;
      }
  }

こんな感じです。

繰り返しになりますが、switch文は条件演算子なので、同じ記述はifelse文を使って書くこともできます。

三項演算子の時にも書きましたが、もし使い方がよくわからなかったら、ifelse文を使って記述することをお勧めします。

おまけ

おまけです。

switch文中で利用されているbreakキーワードですが、{}外で利用していると、 「 ‘break’ must be used within some loop or switch statement(breakはループあるいはswitch文記述内で使われなくてはいけません)」 というコンパイルエラーが発生します。↓

{}の付け忘れには注意しましょう。

まとめ

今回は switch文 について解説しました。

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

  • switch演算子が指定する値とcase演算子の構成する定数リストの各値を比較して、その2つの値が等しい(true)か、等しくない(false)かの条件判定を行い、条件判定がtrueの時に、処理文に書かれている記述内容を実行する。

  • break演算子を使うと、プログラムは直近の{}内を離脱し、{}で括っている部分の処理を、break演算子の記述以降は行わない。

今回は以上になります。

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

【超入門】MQL5 EA講座 第36回「三項演算子(ternary operator)」

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

コメント

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