前回は AND条件、OR条件の記述 について解説しました。
改めて前回の内容をおさらいをしておくと、
- 「指定したの条件の、全てを満たしている」条件をAND条件(論理積)という。
- AND条件を表すには &(アンパサンド)を2つ続けて書く。
- 「指定したの条件の、最低1つを満たしている」条件をOR条件(論理和)という。
- OR条件を表すには |(パイプ)を2つ続けて書く。
ということをお伝えしました。
今回は if文 についてお話ししたいと思います。
if文についてーはじめにー
if文はプログラミング言語の基本概念の1つである「条件分岐」を担当する、MQL5の最重要構文と言っても過言ではありません。
とはいえ、全く難しいものではありません。
今回の講座記事で学ぶことによって、if文をばっちり使いこなしコーディングの幅を広げることができるようになりますので、是非楽しみながら読んで頂ければと思います。
※「true」や「false」といったbool型 についての扱い方や理解がまだよくわからないという方は以下の記事をご覧ください。↓
if文とは?
if文については、フライングして
などでも軽く説明していますが、
if→「もしも~」という英単語の意味通り、「もし()内の条件になっていたら、{}内の処理をしてね」
という意味の記述になります。
if(もしここに書いている内容に合致している条件になったら)
{ ここに書いている内容を実行する}
↑こんな感じですね。
基本的にMQL5において、
記述に一区切りがついたらセミコロン(;)をつける
という決まりがあることは、何度かお伝えしているかと思いますが、
if文の場合は例外で、if()の後にも{}にもセミコロンはつけません。
※if文とは対照的に、
構造体やenum列挙型を宣言する際に用いる{}の後ろにはセミコロンが必要なので、注意してくださいね。
※「構造体? enum列挙型?・・・なんだったっけ?」という方は↓の記事をご覧ください。
if文の役割である
「こうなったら、こうする」
というのは、文章にしてしまえば、他愛もないものですが、
プログラムの肝である、「判断」と「決定」を司っている、最重要構文の1つと言えるでしょう。
このような「判断」と「決定」を行う記述を条件演算と呼び、条件演算にはif文の他に、この後の講座記事で紹介予定のswitch-case文、ternary構文といったものがありますが、この記事で書かれているif文だけしっかり使い方を覚えておけば、他の条件演算の構文を知らなくても、一切困ることはありません。
まずはif文の基本的な使い方から見ていきましょう
if文の基本的な使い方
if文は最初に、
()内に書かれている情報に関して「正しい(true)」か「正しくないか(falese)」の判定をします。
()内に書かれている情報は
単独の値でもいいし、計算式でもいいです。
それらを代入した変数でもいいし、比較関係演算 や 論理積・論理和を含んだ条件文にしてもOKです。
それらを全てtrue/false で切り分けてtrueなら{}の執行処理に進みます。
実際のコードをみていきましょう。
void OnStart()
{
//変数「varBool」を宣言し、trueを代入
bool varBool=true;
//もし変数「varBool」がtrueなら
if(varBool==true)
{
//trueとログ出力する
Print(true);
}
}
↑のサンプルコードにおいて変数「varBool」にはtrueが代入されています。
従って、if文の()内に書かれている記述
if(varBool==true)
は正しいので、その次の{}内に書かれている記述
Print(true);
が執行されます。
なお、
if(varBool==true)
という記述は以下のようにも書き換えられます。
//もし変数「varBool」がtrueなら
if(varBool==true)
↓
//こう書いても同じ
if(varBool)
繰り返しの説明になりますが、if文の()内に記述する条件文は、
単独の値でも、算式でもOKです。
()内に書かれている内容をtrueか、falseで切り分けて執行判断をしているので、
varBool
と変数単独で書いても、そこに格納されている trueを読み取って「true」と判断し、{}内の執行部文に移ります。
わかりやすさをとるなら前者だし、記述のシンプルさ、という合理性から言えば後者になるでしょうか?
実行する内容は同じなので、好みに合わせて記述を選べばよいと思います。
if文の執行内容を記述する{}の取り扱いについて
また、if文()内の条件文がtrueだった場合に、執行内容を記述する
{}
についてですが、
処理内容が、一つの記述式(=セミコロンで締めくくる記述式が一つだけ)で完結するなら省略が可能です。
//もし変数「varBool」がtrueなら
if(varBool==true)
{
//trueとログ出力する
Print(true);
}
↓
//記述式が一つだけなので、{}省略可能
if(varBool==true)Print(true);
サンプルコードを見て頂くと、最初のif(varBool==true)という条件文に対応する執行文には{}が使われていますが、2つ目のif(varBool==true)という条件文に対応する執行文には{}が使われていないません。2つ目のif(varBool==true)は、対応する執行文の{}を省略した形をとっています。
注意したいのが
{}を省略した場合、if文の条件が有効になるのはif()の後の、最初の記述式のみ
ということです。
その後に書かれる記述式は、if文の影響を受けない通常の記述式であることに注意してください。
void OnStart()
{
//変数「varBool」を宣言し、falseを代入
bool varBool=false;
//もし変数「varBool」がtrueなら
if(varBool==true)
{
//ログ出力する
Print(true);
Print(false);
}
上のコードでは、変数「varBool」にはfalseが格納されているので、if文の(varBool==true)は正しくない、と判定され{}内の内容は執行されません。
このサンプルコードの
{}
を取り払うとどうなるかというと↓
void OnStart()
{
//変数「varBool」を宣言し、falseを代入
bool varBool=false;
//もし変数「varBool」がtrueなら
if(varBool==true)
//ログ出力する
Print(true); //if文の条件文に合致しなかったので、執行されない。
Print(false);//if文とは別の、単独文と認識されるので執行される。
コメントアウトされている部分にも書きましたが、
Print(true);
if(varBool==true)
に合致しなかった今回はログ出力されませんでした。
一方、
Print(false);
は、if文とは別の、単独文と認識されるので、ログ出力されます。
関係演算子を使ったif文の記述例
関係演算子を使った例もみていきましょう。↓
void OnStart()
{
//変数「varInt」を宣言し、5を代入
int varInt=5;
//もし変数「varInt」が"4以上なら
if(varInt>=4)Print("4以上");
//もし変数「varInt」が"2以下なら
if(varInt<=2)Print("2以下");
//条件に合致した"4以上"が出力される
}
//+------------------------------------------------------------------+
最初に書かれている
if(varInt>=4)
は
varInt==5につき、条件に合致しているので”4以上”がログ出力されます。
次に書かれている
(varInt<=2)
は
varInt==5につき、条件に合致していないので”2以下”というログは出力されません。
コメント