【超入門】MQL5 EA講座 第31回「計算に関する記述 その2-発展編-」

MQL5でEA作ろう講座

どの記事も、文章中に出てくる各用語については、なるべく関連記事のリンクを貼るようにしているので、講座記事を読み進めていく中で、「わからなくなってしまった」、「忘れてしまった」言葉が出てきたら、クリックして復習していただければと思います<m(__)m>

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

前回計算処理に関する記述の基本 について解説しました。↓

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

  • 剰余とは割り算をして割り切れなかった余りの数を求める計算処理のことを言う

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

今回は前回の計算処理に関する記述について、もう少しだけ応用的な事を お話ししたいと思います。

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

割り当て演算(Assignment Operation)

EAを自作していく中で、場合によっては

変数に現在入っている値を使って、計算処理を行い、その計算結果を新たな値として変数に格納する

という処理を行いたいときがあります。

「・・・ちょっと、まともな日本語しゃべってもらえませんか?( ゚Д゚)」

と思われた方、ごもっともです<m(__)m>

さっさとコードを見ていきましょう。それが一番です。

void OnStart()
{
   //変数「varAdd」に値「8」を代入
      int varAdd=8;
      
   // 変数「varAdd」に現在入っている値「8」と10を足し、varAddに計算結果を返す
   varAdd=varAdd+10;
   
   //8→18に値が更新されたので、「18」がログ出力される
   Print(varAdd);
}

いかがでしょうか?

最初変数「varAdd」には値「8」が入っていました。

varAdd=varAdd+10;

というのはすなわち

「8+10」に他なりませんから、計算結果「18」が代入されて

Print関数によるログ出力時には「18」が出力されます。

間違えないでいただきたいのは、

×元々入っていた値「8」に、「18」を足して「26」

〇元々入っていた値「8」を代入によって更新して「18」

ということです。

プログラムの原則である順次進行(プログラムは基本的に記述した順に上から下に向かって処理される)によって、変数の値が更新された形です。

元々入っていた値「8」に、「18」を足して「26」

という結果を導くには別の記述が必要になります。

この記事の最後におまけとして紹介します。

複合代入演算子

先ほどのサンプルコードで例に出した

varAdd=varAdd+10;

という記述は↓のように書き換えることもできます。

//変数「varAdd」に値「8」を代入
      int varAdd=8;
      
   // 変数「varAdd」に現在入っている値「8」と10を足し、varAddに計算結果を返す
   varAdd+=10;
   
   //8→18に値が更新されたので、「18」がログ出力される
   Print(varAdd);

どうでしょう?

varAdd=varAdd+10; → varAdd+=10;

と書き換わっているのですが、計算処理としては同じ

「8+10」

を行って、varAddの値を「18」に更新しています。

左辺の変数名の右側に 「+=」を記述することによって

左辺の変数と、右辺の値を足し合わせる

という処理を実現させています。

このような処理は足し算だけでなく、引き算掛け算割り算剰余算でも同様の処理が行えます。

varSub-=5; //varSub=varSub-5と同じ
varMulti*=5; //varMulti=varMulti*5と同じ
varDiv/=5; //varDiv=varDiv/5と同じ
varMod%=5; //varMod=varMod%5と同じ

上のような関係になります。

このような

左辺の変数と、右辺の値を計算処理して再び左辺の変数に値を代入する機能を持つ

「+=」「 -=」「 *= 」「/= 」「%=」

のことを複合代入演算子と呼びます。

名前はどうでもいいので、上記の記号がどのような計算処理をおこなうものなのか、ということは押さえておいてください。

インクリメントとデクリメント(Increment,Decrement)

インクリメントについて

インクリメントは「増加させる」

という意味を持つ単語です。

プログラミングの記述で言うと、以下のようなものを言います。

varAdd++;//インクリメント

インクリメントの場合、

変数名の右側に +を2つ記述する

という説明になります。

インクリメント

現在の変数に格納されている値にプラス1した値を変数に返す

という処理を行います。

int varAdd=0;//変数を宣言し0を代入
varAdd++;//インクリメント

Print(varAdd);//ログ出力すると「1」が表示される

varAddは最初値「0」だったところに、インクリメント処理を行ったことによって値「1」となりました。

インクリメント

varAdd++

というのは、

varAdd=varAdd+1;を簡略化したもの

ということです。

デクリメントについて

デクリメントは「減少させる」

という意味を持つ単語です。

プログラミングの記述で言うと、以下のようなものを言います。

varSub--;//デクリメント

デクリメントの場合、変数名の右側に、-を2つ記述する

という説明になります。

デクリメント

現在の変数に格納されている値にマイナス1した値を変数に返す。

という処理を行います。

int varSub=3;//変数を宣言し3を代入
varSub--;//デクリメント

Print(varSub);//ログ出力すると「2」が表示される

varSubは最初値「3」だったところに、デクリメント処理を行ったことによって値「2」となりました。

デクリメント

varSub–

というのは、

varSub=varSub-1;を簡略化したもの

ということです。

このインクリメントデクリメントという記述は、プログラミング動作の基本の1つである

繰り返し処理

と大変相性が良く、EAを自作する上でもよく使われますから、是非使いこなせるようになってください。

※繰り返し処理という概念についてはこの後の講座記事

にて解説をしていますので、もう少々お待ちください。

インクリメント/デクリメントと複合代入演算子の違いについて

ここでいったんインクリメント/デクリメント複合代入演算子の違いについておさらいをしておきましょう。

インクリメントデクリメントは、プログラミングにおいて頻繁に使われる演算子で、特に値を1増やす(インクリメント)または1減らす(デクリメント)時だけに用いられます。

一方で、複合代入演算子は値の増減だけでなく、他の演算(足し算引き算掛け算割り算剰余)も一緒に行うことができる演算子です。

インクリメント演算子(++)は、変数の値を1だけ増やすために使用されます。たとえば、x++という記述は、「x = x + 1」と同じ意味を持ちます。同様に、デクリメント演算子(--)は、変数の値を1だけ減らす際に使用され、xは「x = x - 1」と同等です。

これに対して、複合代入演算子は、より一般的な操作を簡潔に書くために使われます。たとえば、「x = x + 5」という式は、x += 5と書くことができます。

これは、xの現在の値に5を加え、その結果を再びx代入するという意味です。複合代入演算子足し算+=)、引き算-=)、掛け算*=)、割り算/=)など、さまざまな演算で使用されます。

インクリメントデクリメントは、値をちょうど1だけ変更する特定の場面で便利です。

それに対し、複合代入演算子はより広範な計算をコンパクトに記述するのに適しています。

これらの違いを理解することは、プログラミングにおいて効率的で読みやすいコードを書く上で重要です。

おまけ

割り当て演算(Assignment Operation)の項目のところで、↓のコードについて、

void OnStart()
{

   //変数「varAdd」に値「8」を代入
      int varAdd=8;
      
   // 変数「varAdd」に現在入っている値「8」と10を足し、varAddに計算結果を返す
   varAdd=varAdd+10;
   
   //8→18に値が更新されたので、「18」がログ出力される
   Print(varAdd);
   

     
}

元々入っていた値「8」に、「18」を足して「26」

ではなくて、

元々入っていた値「8」を代入によって更新して「18」

になっているんだ、とお伝えしました。

だとすると、

元々入っていた値「8」に、「18」を足して「26」という処理結果を導きたい場合はどうすればよいのでしょうか?

答えは(一つではないのですが)こうなります↓

void OnStart()
{

   //変数「varAdd」に値「8」を代入
      int varAdd=8;
      
   // 変数「varAdd」に現在入っている値「8」と「varAdd+10」を足し、varAddに計算結果を返す
   varAdd+=varAdd+10;
   
   //8→26に値が更新されたので、「26」がログ出力される
   Print(varAdd);
}

こんな感じです。

変えた部分は

varAdd=varAdd+10; → varAdd+=varAdd+10;

左辺のvarAddに+を追加して複合代入演算子にしただけです。

これによって元々

8+10

だった計算式が

8+8+10

に代わり、結果、代入される値が「26」になった形です。

まとめ

今回は計算処理の記述について発展形のパターン を解説しました。

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

  • 変数に現在入っている値を使って、計算処理を行い、その計算結果を新たな値として変数に格納することもできる

今回は以上になります。

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

【超入門】MQL5 EA講座 第30回「計算に関する記述 その1-基本編-」

         →【超入門】MQL5 EA講座 第32回「関係演算子(Relation Operations)」

コメント

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