———————-
前回は break演算子とcontinue演算子について解説しました。
改めて前回の内容をおさらいをしておくと、
- break演算子は、条件演算や繰り返し構文で使われる{}内の処理を途中で離脱する為に使う。
- continue演算子は特定の条件になったらスキップして次のループに移る動作をさせたい時に使う
ということをお伝えしました。
今回は return演算子についてお話ししたいと思います。
※本記事を読み進める前に。
この「MQL5でEA作ろう講座」もだいぶ回数が進んできました。
ここまで学んできたことの中で、知識の抜け漏れはありませんでしょうか?
以下の記事をご覧いただき、復習しておくと本記事の理解がより深まるかと思います。
- 第25回「関数について」
- 第10回「データ型」
- 第11回「データ型その1 整数型」
- 第12回「データ型その2 実数型」
- 第13回「データ型その3 文字列型」
- 第14回「データ型その4 Bool(ブール)型」
- 第21回「Enum列挙型」
- 第22回「構造体」
return演算子とは?
return演算子は、第25回講座記事の「関数」 の中で、「戻り値」という概念を説明する上で出てきました。そこでもそれなりに、細かく取り上げており、基本的な事項をそこに書いてあることで十分とも言えるのですが、補足事項もあるので改めて取り上げます。
return演算子は以下の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 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>
コメント