改めて前回の内容をおさらいをしておくと、
- switch文は、if文 や else文、三項演算子(ternary operator)と同様に、条件演算子(「~したら・・・する」、という条件と処理を担う記述群)の1つである。
- switch演算子が指定する値とcase演算子の構成する定数リストの各値を比較して、その2つの値が等しい(true)か、等しくない(false)かの条件判定を行い、条件判定がtrueの時に、処理文に書かれている記述内容を実行する。
- default演算子は、switch演算子で指定した値が、case演算子で指定した定数リストの値のどれとも一致しない場合に実行する処理を指定する演算子である。
- switch演算子で指定した値が、case演算子で指定した定数リストの値のどれとも一致しない場合に、実行したい処理がなければdefault演算子は設置しなくても良い。
ということをお伝えしました。
今回は while文 についてお話ししたいと思います。
while文とは?
プログラムの挙動に関する、重要な原則として
- 順次進行(書かれている順番に上から下へ処理を行っていく。※一部例外あり)
- 条件分岐(「Aの場合は、Bの処理をする。Cの場合は、Dの処理をする」といったように条件に応じて処理が分かれていく)
- 繰り返し(同じ処理を複数回繰り返し行う)
というものがあります。
突き詰めていくと、プログラムというのは、「これだけやっている」とさえ、言えるかもしれません。
while文はそのうちの、
「繰り返し処理」命令をする記述の1つです。
「繰り返し処理」命令をする記述には、while文の他に、この後講座記事で取り上げる
があります。
while文の使い方
3つの「繰り返し処理」命令をする記述のうち、もっともシンプルなループ構造になっています。
↓のサンプルコードをご覧ください。
void OnStart()
{ //変数「loopCondition」を宣言し、trueを代入
bool loopCondition=true;
//ループカウント用の整数型変数「counter」を用意
int counter=1;
//loopConditionがtrueである間はループする。
while (loopCondition==true)
{
//ログ出力
Print(counter);//1,2,3,4,5が出力される
//counterが5になったら、loopConditionにfalseを代入
if(counter==5)loopCondition=false;
//現在の格納値にプラス1する(インクリメント)
counter++;
}
}
//+------------------------------------------------------------------+
while文を作るには、まず最初に
while演算子を記述し、その後()内にループ継続を判定する条件を記述します。
//loopConditionがtrueである間はループする。
while (loopCondition==true)
()内にループ継続を判定する条件を記述した後は、
{}内に、繰り返しておこなう処理内容を記述していきます。
()内の条件を満たしている間は、{}内の一番下まで進んでも、それより下の記述は読み込まず、また{}内の頭から同じ処理を繰り返します。
サンプルコードでは
ループ継続を判定する条件は
(loopCondition==true)//loopConditionがtrueである間は・・・
と設定しています。言い換えれば、もし
(loopCondition==false)
となったら、ループは終了するような記述となっております。
{
//ログ出力
Print(counter);//1,2,3,4,5が出力される
//counterが5になったら、loopConditionにfalseを代入
if(counter==5)loopCondition=false;
//現在の格納値にプラス1する(インクリメント)
counter++;
}
最初は、
Print関数を使って変数「counter」に格納されている値をログ出力します。
変数「counter」には、最初「1」が入っているのですが、
{}内の一番下に
counter++;
というインクリメント(現在の格納値にプラス1する処理)が入っていますから、
ループするたびに、変数「counter」の値は、2,3,4・・・と増えていきます。
{}内の真ん中にあるif文の記述↓は
//counterが5になったら、loopConditionにfalseを代入
if(counter==5)loopCondition=false;
変数「counter」が5になった後の、該当箇所記述によって
bool型の変数「loopCondition」がtrueからfalseに変わることを意味します。
(loopCondition==true)がループ継続の条件でしたから、これでループは終了です。
※ちなみに、ループ終了時変数「counter」の値はいくつになっているでしょうか?
・・・答えは「6」です。
順次進行の原則に注意を払ってもう一度コードをよく見てみると・・・
{
//今、counterの値が「5」であると仮定する
//counterが5なので、loopConditionはfalseとなり、ループ終了は決定
if(counter==5)loopCondition=false;
//まだ、最後のループを抜けていないのでインクリメントは有効
counter++;//インクリメントにより「6」になって、ループ終了
}
変数「counter」の変遷は以上のようになっています。
このサンプルコードは
ループ継続を判定する条件にtrue,false真偽値を指定したパターン
でしたが、
関係演算子を用いて記述することもできます。
関係演算子を用いたwhile文のパターン
・・・関係演算子は覚えていらっしゃいますか?
関係演算子とは
「AよりBが大きい」
とか
「AとBは等しい」
とか
「AとBは等しくない」
など、
2つの値の関係性を明示するための記述群を指します。詳しくは↓の記事をご覧ください
では、関係演算子を用いたwhile文のサンプルコードをみていきましょう。↓
void OnStart()
{
//ループカウント用の整数型変数「counter」を用意
int counter=1;
//counterが5以下である間はループする。
while (counter<=5)
{
//ログ出力
Print(counter);//1,2,3,4,5が出力される
counter++;
}
}
ループ継続を判定する条件を
変数「counter」が5以下(5と等しいか、5より小さい)である間は
としました。
したがって、変数「counter」がインクリメントによって、5に達するまではループが継続し、6になった段階でループが終了します。
最初のサンプルコードとは記述内容は違いますが、
Print関数によって、1,2,3,4,5が出力される
という同じ結果が導き出されました。
while文を使う上での注意 -無限ループについて-
while文では()内に、ループを継続するか判定する条件を記述するわけですが、
ループを終了させる条件記述がなかったり、記述が適切でなかった場合、ループが終了せずに無限ループになってしまう可能性があるため記述には注意を払いたいところです。
例えば
//loopConditionがtrueである間はループする。
while (loopCondition==true)
{
//ログ出力
//Print(counter);//1,2,3,4,5が出力される
//現在の格納値にプラス1する(インクリメント)
counter++;
Print(counter);
}
上記のようなサンプルコードの場合、ループ継続の条件が
loopCondition==true
としているのに、
{}内に、loopConditionがfalseになるような条件式がない為、無限ループとなります。
このサンプルコードを実行すると・・・↓
インクリメントしたcounterの値をずっとログ出力し続けることになってしまいます。
もっとも条件文に無限ループとなるような記述をする事が必ずしも悪い訳ではありません。
繰り返し処理を規定する{}内に、特定の条件を満たしたらbreak演算子でループを離脱するような記述をする事も可能です。詳しい事は
・MQL5 EA講座 第41回「breakとcontinue」
で解説予定ですのでお待ちください
まとめ
今回は while文 について解説しました。
今回の記事では以下のことを学びました
- while文は、プログラムに「繰り返し処理」命令をする記述の1つである。
- while文を作る際は、while演算子を記述し、その後()内にループ継続を判定する条件を記述する
- ()内にループ継続を判定する条件を記述した後は、{}内に、繰り返しておこなう処理内容を記述する。
- ループを終了させる条件記述がなかったり、記述が適切でなかった場合、ループが終了せずに無限ループになってしまう可能性があるため記述には注意
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
コメント