プログラムの実行開始から終了までのあいだ、メモリ上に存在し続けており、値を失わない変数のことです。
プログラミング言語によって異なる呼び方をする場合があります。また、ソースコード上でどのように表現するかにも違いがあります。
多くの場合、通常ならば関数の呼び出しごとに生存と破棄が繰り返されるローカル変数(自動変数)に対して、なんらかの指定によって、生存期間をプログラムの実行開始から終了までに変更されたものを指します。そのほか、(プログラミング言語の仕様によるが)グローバル変数やクラス変数のように、プログラムの実行開始から終了まで存在することが仕様上当然である場合にも、静的変数と呼ぶことがあります。
C言語では、静的記憶域期間という用語で表現されます(「静的記憶域期間をもつ変数」のように)。
通常のローカル変数の宣言に対して、static指定子を付加すると、静的記憶域期間をもつ変数になります(C言語編第24章)。
void func(void)
{
static int count = 0; // 静的記憶域期間をもつ変数。
// プログラムの実行開始から終了まで存在しており、関数を抜けても値を失わない
++count;
}
また、グローバル変数はつねに静的記憶域期間を持っています。グローバル変数の宣言に対しても static指定子を付加できますが、これは内部結合にすることをあらわすものです(C言語編第24章)。
C言語では、「ローカル変数」や「グローバル変数」も規格上は登場しない用語です。ここでの用法では、前者は「自動記憶域期間をもつ変数」ということになります。後者は簡潔な呼び名がないので一般的に「グローバル変数」や「大域変数」と呼ばれます。
C++ も、C言語と基本的に同じですが、static指定子を付加して宣言されたローカル変数に関して、明示的に初期化子を記述しておこなう初期化のタイミングは、実際にその変数を宣言している箇所が実行されるときに変更されています。
いずれにせよ、静的記憶域期間をもつ場合、プログラム実行開始時点でゼロ初期化が行われるため、まず 0
によって初期化されていることが保証されます。宣言箇所を通過するときに、明示的に与えた初期化子や、コンストラクタによる初期化があらためて行われます。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
Twitter でツイート/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |