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

MQL5でEA作ろう講座

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

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

  • if文は「~したら・・・する」という条件演算子の1つである。

  • if文は()内に書かれている記述について「正しい(true)」か「正しくないか(false)」の判定を行い、「正しい(true)」の場合に{}内の記述を実行する。

  • if文において、{}内の処理内容が、一つの記述式(=セミコロンで締めくくる記述式が一つだけ)で完結するなら{}の省略が可能

  • {}を省略した場合、if文の条件が有効になるのはif()の後の、最初の記述式のみ

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

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

else文if文とセットで使われる、プログラミングの条件分岐を担う重要構文です。

今回も丁寧な解説を心がけていますので、バッチリ理解してEA開発への道のりを1歩進めていきましょう。

「true」や「false」といったbool型 についての扱い方や理解がまだよくわからないという方は以下の記事をご覧ください。

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

else文 とは?

そもそもの、else という英単語は

「そのほかの、別の」という意味を表す副詞であり、else文 もその意を組んだ処理文となっています。

else文 は if文と連動して使う記述

で、端的に言えば

if文の内容が「正しくない(false)」と判定された場合に、それを受けて発動する記述

になります。

従って、else文単独で記述することはありません。

単独で記述していた場合、illegal ‘else’ without matching ‘if’「対応するifがない不適切なelseです」というコンパイルエラーが発生してしまいます)↓

ifの()内に記載されている条件が「正しくない(false)」である場合、それを受けてelse文が発動します。


void OnStart()
  {

   //変数「varBool」を宣言し、falseを代入
   bool varBool=false;
   
   //varBoolがtrueなら
   if(varBool==true)
   {
   //trueとログ出力する
   Print(true);
   }
   
   //そうでないなら(=varBoolがfalseなら)、falseとログ出力する
   else Print(false);
     


  }
//+------------------------------------------------------------------+

変数「varBool」には、falseが代入されています。

従って、

if(varBool==true)

という条件文は「正しくない(false)」となり、if文の{}内容は執行されません。

if文の条件が「正しくない(false)」であったことを受けて、初めてelse文のコード記述が判定・執行されます

「そうでないなら(=varBoolがfalseなら)」

という条件に合致しているので、、執行内容である、

Print(false);

が執行されます。

※なお、elseの後の、執行文記述についてはif文と同じく、

{}内の処理内容が、一つの記述式(=セミコロンで締めくくる記述式が一つだけ)で完結するなら{}の省略が可能

となっています。今回のサンプルコードのような

Print(false);だけ、といった場合ですね。

執行内容記述が複数文ある場合は、{}が必要となります。↓


void OnStart()
  {

   //変数「varBool」を宣言し、falseを代入
   bool varBool=false;
   
   //varBoolがtrueなら
   if(varBool==true)
   {
   //trueとログ出力する
   Print(true);
   }
   
   //そうでないなら(=varBoolがfalseなら)、falseとログ出力する
   else
   {
   //falseとログ出力する
    Print(false);
    //falseとコメント出力する
    Comment(false);
   } 


  }
//+------------------------------------------------------------------+

elseの執行文、

Print(false);に

Comment(false);

を加えたいので、{}を用いて、処理記述全体を挟みました。

else文を使わずに記述しようとすると条件文記述は

if(varBool==false)

になる訳ですが、else文を使う事によって条件文を具体的に記述する事を省略できます。

ここまでが、else文の基本なのですが、ここまで見て頂いたのは

if文else文を用いた、条件分岐が2つの場合の記述

です。

もしAの条件だったら、~する。Aの条件じゃなかったら・・・する。

というパターンですね。

今度は条件分岐が3つ以上になった場合の、if文else文の使い方を見てみましょう。

条件分岐が3つ以上ある場合の記述 -else if文-

条件分岐が3つ以上ある場合、if と else の合成演算子である、

else if

というキーワードを合わせて用いることで記述をしていきます。↓

void OnStart()
  {

//変数「varStr1」を宣言し、"horse"を代入
   string varStr1="horse";


//varStr1がrabbitなら
   if(varStr1=="rabbit")
     {
      //rabbitとログ出力する
      Print("rabbit");
     }

//そうでなく(=varBoolがrabbitなく)、
//varStr1がFoxなら
   else
      if(varStr1=="Fox")
        {
         //Foxとログ出力する
         Print("Fox");
        }
        
//どちらでもない(=varStr1がrabbitでもFoxでもないなら)
      else
         Print("Not rabbit or Fox");


  }

今回のサンプルコードにおいて、条件判定の材料とされているのは、

string型の 変数「varStr1」です。

「varStr1」には、文字列 ”horse” が代入されている状態です。

最初のif文条件

if(varStr1==”rabbit”)は正しくないので、if文の{}内容

Print(“rabbit”);

は執行されません。

if文の条件否定を受けて、今度は

else ifの条件判定に移ります。

else ifの条件

(varStr1==”Fox”)は正しくないので、の{}内容は執行されません。

if文else ifの条件否定を受けて、最後は

else

条件判定に移ります。

elseの条件は明示的に記述されていませんが、読み解くと

(varStr1がrabbitでもFoxでもないなら)

ということになりますが、この内容は正しい(=true)です。

従って、{}内容

Print(“Not rabbit or Fox”);が執行されます。

サンプルコードの例は、条件分岐が3つの例でしたが、条件分岐が3つ以上の場合はelse ifの数を増やすことによって、対応します。

void OnStart()
  {

//変数「varStr1」を宣言し、"horse"を代入
   string varStr1="horse";


//varStr1がrabbitなら
   if(varStr1=="rabbit")
     {
      //rabbitとログ出力する
      Print("rabbit");
     }

//そうでなく(=varBoolがrabbitなく)、
//varStr1がFoxなら
   else
      if(varStr1=="Fox")
        {
         //Foxとログ出力する
         Print("Fox");
        }

//そうでなく(=varBoolがrabbitなく、Foxでもなく)、
//varStr1がlionなら
   else
      if(varStr1=="lion")
        {
         //lionとログ出力する
         Print("lion");
        }
        
//どちらでもない(=varStr1がrabbitでもFoxでもlionでもないなら)
      else
         Print("Not rabbit or Fox or lion");


  }

条件分岐が4つになり、

という記述構成に変わりました。

else ifは必ず、if文より後に記述されなくてはいけませんし、else文より前に記述されなくてはいけません。

また

if文else ifが連なる記述だからと言って、最後に必ずelse文の配置が必須という訳ではありません。

else文はあくまで、「if文else if全てが否定された時に執行される記述」であり、if文else if全てが否定された時に執行される記述」自体が必要なければ文法的には問題ないですし、コンパイルエラーが発生することもありません。↓

void OnStart()
  {

//変数「varStr1」を宣言し、"horse"を代入
   string varStr1="horse";


//varStr1がrabbitなら
   if(varStr1=="rabbit")
     {
      //rabbitとログ出力する
      Print("rabbit");
     }

//そうでなく(=varBoolがrabbitなく)、
//varStr1がFoxなら
   else
      if(varStr1=="Fox")
        {
         //Foxとログ出力する
         Print("Fox");
        }

//そうでなく(=varBoolがrabbitなく、Foxでもなく)、
//varStr1がlionなら
   else
      if(varStr1=="lion")
        {
         //lionとログ出力する
         Print("lion");
        }
        
/*varStr1にはhorseがはいっておらず、else文もない為、
このままだと何のログ出力もされないが、そういう意図でプログラミング
しているのであれば問題ない*/
     


  }

おまけ

else ifはともかく、

else文は先述した通り、

条件内容を明示的に記述しないため、条件判定に詰めの甘さを残す場合、else文の記述箇所が原因で、意図しない動作を引き起こしがちです。

条件分岐の数が多いときに、日本語で「あれでもなくて、これでもなくて・・・」みたいな思考で整理をしようとするのは間違いのもとです。

あくまで、

else文の前に記述されている if文 や else ifの条件が全てfalseの場合に執行される

というelse文の大前提を押さえたうえで、コメントアウト箇所に、else文の条件内容を具体的に記載して条件を視認・整理できるようにおくなどの対策を取り、慎重に開発を進めた方が良いと思います。

あるいは、いっそのこと最初のうちは、else文を使わず、多少コードが冗長になっても、

if文と else ifだけで全ての条件分岐が明示的に記述されるように構成していく、というのも一つの手段かと思います。

まとめ

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

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

  • else文if文の内容が「正しくない(false)」と判定された場合に、それを受けて発動する記述である。

  • 条件分岐が3つ以上ある場合、if と else の合成演算子である、「else if」というキーワードを合わせて用いる

  • else ifは必ず、if文より後に記述されている必要があり、else文より前に記述されている必要がある。

  • if文else ifが連なる記述だからと言って、最後に必ずelse文の配置が必須という訳ではなく、「if文else if全てが否定された時に執行される記述」が必要なければ省略可。

今回は以上になります。

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

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

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

コメント

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