【超入門】MQL5 EA講座 第42回「return演算子について」【EAの作り方】

MQL5でEA作ろう講座

———————-

前回は break演算子とcontinue演算子について解説しました。

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

  • break演算子は、条件演算や繰り返し構文で使われる{}内の処理を途中で離脱する為に使う。

  • continue演算子は特定の条件になったらスキップして次のループに移る動作をさせたい時に使う

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

今回は return演算子についてお話ししたいと思います。

※本記事を読み進める前に。

この「MQL5でEA作ろう講座」もだいぶ回数が進んできました。

ここまで学んできたことの中で、知識の抜け漏れはありませんでしょうか?

以下の記事をご覧いただき、復習しておくと本記事の理解がより深まるかと思います。

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

return演算子とは?

return演算子は、第25回講座記事の「関数」 の中で、戻り値という概念を説明する上で出てきました。そこでもそれなりに、細かく取り上げており、基本的な事項をそこに書いてあることで十分とも言えるのですが、補足事項もあるので改めて取り上げます。

return演算子は以下の2つの機能を持っています

  1. 関数の処理を終了する。
  2. 関数の終了時に戻り値を返す。

コーヒーメーカーのボタンを押したら、コーヒーが出てくるように、

関数が処理をした「結果」を返す役割を持つのが、return演算子という訳です。

return演算子の使い方

関数は、戻り値データ型が後述するvoid型である場合を除き、最低1つは関数内にreturn演算子を記述しないといけません。

戻り値には変数、もしくは算式を指定します。構造を確認しましょう。↓

データ型 関数名()
{
     return 戻り値;
}

こんな感じですね。

戻り値は、関数の宣言時に指定したデータ型と同じ種類のデータを返さなくてはいけません。

仮に、宣言時のデータ型int型(整数型)にしていたら、戻り値に指定する変数int型(整数型)にしなくてはいけないということですね。

※厳密にいうと、コンパイルは通りますが、「possible loss of data due to type conversion~」の警告が出て、データ欠損の原因になります

int exampleFunction()
  {
      double varDouble=0.5;
      
      //int型の指定なのに、double型のデータを返しているので警告が出る
      return varDouble;
  
  }

return演算子を記述する場所は?

return演算子を記述する場所については、

関数の実装記述をする{}内であれば、どこでも構いません。

ただし、return演算子の役割が「関数の処理結果を呼び出し元(主にイベントハンドラー)に返す」という性質上、{}内の文末付近に置かれることが多いです。

returnは現在の関数実行を終了する役割を担っているので、return記述より後の処理が実行されません。

void OnStart()
  {     
       
        return;
         Print("テスト");

  }

サンプルコードを実行した動画では、return記述より前にログ出力命令を配置して再コンパイルすることによってログ出力されるようになっています。

return演算子を設置する数について

実装する関数の処理内容に応じて、return演算子を複数設置することは可能です。

return演算子を1つか、複数設置するかは、どんな関数を作るか次第ということですね。


void OnStart()
  {   
     exampleFunction関数の戻り値を受け取る変数「result」を宣言
     int result=exampleFunction();
     Print(result);//5が出力される
     
     
  }
  
  int exampleFunction()
  {
      bool varBool=true;
      //varBoolがtrueなら「5」を返す
      if(varBool==true)return 5;
      
//varBoolがfalseなら「3」を返す
       else return 3;
  
  }
//+------------------------------------------------------------------+

exampleFunction関数の{}内には、

varBoolがtrueなら「5」を返す

varBoolがfalseなら「3」を返す

という処理内容を実現する為に、return演算子が2つ記述されています。

メインプログラムであるOnStart関数内では、このexampleFunction関数戻り値を受け取るint型の変数「result」が宣言され、それをPrint関数ログ出力しています。

exampleFunction関数内の変数「varBool」はtrueなので、ログ出力では「5」が出力されます。

void型とは?

void型というのは、「型なし」ということを意味します。

void型についても、第25回「関数について」で割と詳しく説明しているのですが、改めて言うと

戻り値を返す必要のない関数に対して用いるデータ型です。

void OnStart()
  {   
     
     voidFunction();//「void型の関数です」とログ出力される
     
     
  }

  void voidFunction()
  {
  
      Print("void型の関数です");
  }
  

↑のサンプルコードにあるvoidFunction関数Print関数によって「void型関数です」というログ出力を担っている関数です。

何か値を返す処理を必要としていないので、戻り値を設定しないvoid型関数になりました。

呼び出し元のOnStart関数内でも、特に戻り値を受け取るための変数宣言等もしておらず、voidFunction関数だけを記述しています。

void型関数におけるreturn演算子の省略

戻り値void型にしている関数は{}内のreturnキーワード記述を省略できます。

戻り値を指定しなければ、別に書いてもエラーや警告は出ません)

void voidFunction()
  {
  
      Print("void型の関数です");
      return;//別に省略しなくてもよい
  }
     

ただし、↓のように、void型なのにも関わらず、「5」という値を指定する

「’return’ – ‘void’ function returns a value(void型の関数が値を返しています)」

というコンパイルエラーが発生します

void voidFunction()
  {
  
      Print("void型の関数です");
      return 5;//void型関数に戻り値を設定した為、コンパイルエラーが発生
  }

※これまでの講座記事にほぼ毎回登場していた、OnTick関数OnStart関数にもvoid というキーワードがついていたのを記憶されていらっしゃるでしょうか?

これは、OnTick関数OnStart関数が、戻り値を必要としないタイプの処理を担っている関数である、ということを意味しています。

戻り値と配列について

基本的に戻り値には、どのデータ型も指定することができます

enum列挙型構造体戻り値として指定できます↓

enum EXMAMPLE
  {
   ex1,
   ex2,
   ex3
  
  };
 
  EXMAMPLE exampleFunction()
  {
      
      return ex1;
  }

↑はenum列挙型の例。これはOKですし、

 struct stExample
  {
    int stEx1;
    double stEx2;
    string stEx3;
  };
  
  stExample exampleFunction()
  {
      stExample st;
     
     st.stEx1=1;
     st.stEx2=0.4;
     st.stEx3="構造体文字列";
     
      return st;
  }

↑この構造体戻り値にした例も、コンパイルエラーにはなりません。

ただし、戻り値として配列を返すことはできません。

例えば、

int varArray[5]={1,2,3,4,5};

という配列があったとして、この配列全体をreturn演算子を使って返すことはできません。

(return varArray[0];とか、return varArray[3];のような形であれば、配列ではなく、個別のint型変数になるので可能です)

関数の処理結果を配列として返したい場合は、

参照渡し

という記述が必要になります。

参照渡しについては、第44回で、1つの記事として取り上げますので↓、今はよくわからなくても大丈夫です

まとめ

今回は return演算子 について解説しました。

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

  • 戻り値には、関数の宣言時に指定したデータ型を同じ種類のデータを返すように記述しないと、データ欠損の可能性がある。

今回は以上になります。

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

【超入門】MQL5 EA講座 第41回「breakとcontinue」

         →【超入門】MQL5 EA講座 第43回「値渡しについて」【EAの作り方】

コメント

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