※どの記事も、文章中に出てくる各用語については、なるべく関連記事のリンクを貼るようにしているので、講座記事を読み進めていく中で、「わからなくなってしまった」、「忘れてしまった」言葉が出てきたら、クリックして復習していただければと思います<m(__)m>
今回はstatic変数についてお話ししたいと思います。
static変数とは?
static変数とは、
特定の関数内で宣言をされ、その関数が処理を終えても、値の記憶を保つことができるローカル変数
のことです。
・・・「ちょっとマジで何を言っているのかわかんないですけど( 一一)」
と思われる方、申し訳ありません。<m(__)m>
順を追って説明していきますので、まずは落ち着きましょう。
通常ローカル変数は、有効範囲(スコープ)が、関数等の{}内に限定されるので、関数が処理を終えるとその値の記憶を保つことができません。
// void型の sampleFunctionを関数として宣言
void sampleFunction()
{
//変数「varInt」を宣言し、値「0」を代入
int varInt=0;
//変数「varInt」に値「1」を代入
varInt=varInt+1;
Print(varInt);
}
void OnTick()
{
//関数の呼び出し
sampleFunction();
}
最初に、sampleFunction関数の中で変数varIntを宣言し、値「0」を代入しています。
その下にある
varInt=varInt+1;
という記述を見て、「何これ?」と思った方もいるかもしれません。
これはインクリメントという処理なのですが、
MQL5における計算の規則については、まだ説明していないので、わからなくて当然です。
※計算に関する記述については
までもう少々お待ちください。
最初varIntには0がはいっているので、
varInt=varInt+1;
↓
varInt=0+1;
すなわち1が新たに代入されたと考えてください。
これをOnTick関数の中で呼び出すと
値動きがあるたびに、値「1」がログ出力され続けます。↓
値の記憶を保つことができないために、値動きがあるたびに、いったん変数宣言時に代入した0にいったん初期化されてしまうので、0→1→1がログ出力、という繰り返しになっているんですね。
「・・・だから何?(; ・`д・´)」
と思われるかもしれませんが、設計する自動売買プログラム(EA)の内容によっては、いちいち変数の値がリセットされてしまうのは不都合な場合があるんです。
例えば、日付データを格納している変数があったとして、その日付データを判断材料にトレードをしようとしているときに、その日付データが肝心なところでリセットしてしまったら、トレード自体ができなくなってしまう・・・と言ったようなことも起こり得ます。
※ちなみに、日付データを格納する変数のデータ型にはdatetime型を用います。
忘れてしまった方は↓の記事を見直していただければと思います。
ローカル変数をstatic変数にすると、関数が処理を終えても変数が値を保つことができるようになります。
これにより、関数が呼び出されるたびに変数を初期化する必要がなくなり、また関数の異なる呼び出し間でデータを保持することができます。
これは、関数の状態を保持するか、関数呼び出し間で共有される特定の情報を管理する際に有用です。
static変数の作り方
static変数を作るときには、
宣言するデータ型の前に、static というキーワードを記述する
ことで達成できます。
// void型の sampleFunctionを関数として宣言
void sampleFunction()
{
//変数「varInt」を宣言時、staticをつけてstatic変数を作る
static int varInt=0;
//変数「varInt」に値「1」を代入
varInt=varInt+1;
Print(varInt);
}
void OnTick()
{
//関数の呼び出し
sampleFunction();
}
最初のサンプルコードとの違いは、変数「varInt」の宣言時にデータ型 int の前にstaticキーワードを追加しただけです。
↓の動画を見てください。
最初は、staticキーワードをつけずに普通のローカル変数として、プログラムを走らせているのですが、後半staticキーワードをつけてコンパイルしてみたものです。
いかがでしょうか?
最初は「1」しか表示されていなかったのに、staticキーワードをつけてコンパイルした後は、「2,3,4・・・」と値が増えていくようになりましたよね。
本来は関数が処理を終えると、値が初期値の0になるのですが、staticキーワードをつけたことによって、変数が値の記憶を保つことができるようになり、関数が処理を終えても0にならないため、数が積みあがっているんですね。
※ちなみに初期値(default value) という言葉を日常感覚の延長で考えると、つい
初期値=0
と考えてしまいがちですが、あくまで初期値は
最初に設定した値
であり、無条件に初期値=0という風に考えないよう注意してください。
サンプルコードの例はあくまで初期値を「自身で0に設定した」から0になっているのであって
例えば
// void型の sampleFunctionを関数として宣言
void sampleFunction()
{
//変数「varInt」を宣言時、初期値を5に設定する
int varInt=5;
Print(varInt);
}
void OnTick()
{
//関数の呼び出し
sampleFunction();
}
のように初期値を5に設定すれば
↓
初期値については、第46回「関数の初期値について」 で詳しく取り上げる予定なのでもうしばらくお待ちください<m(__)m>
まとめ
今回はstatic変数 について解説しました。
今回の記事では以下のことを学びました
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
コメント