ローカル変数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

ローカル変数局所変数: local variable)とは、プログラムの一部分でしか利用できない変数のことである。一般的にグローバル変数(大域変数)と対比される。ローカル変数の定義はプログラミング言語によって異なるので、詳細な説明は言語別の項に譲る。

C言語[編集]

C言語およびC++のローカル変数は、同じ「ブロック」という領域内からのみ参照可能な変数である。C99よりも前の規格ではブロックの先頭部分でのみ定義可能だったが、C99からはC++同様に任意の位置で定義可能である。

ローカル変数のスコープ (scope) すなわち可視性は、その変数が宣言された場所から、その変数が定義されたブロックを抜けるまでである。スコープ外からは参照することができない。

下記の例において、2行目で宣言されているローカル変数iのスコープは2行目から6行目の中括弧までであり、4行目で宣言されているローカル変数jのスコープは4行目から5行目の中括弧までである。

1 void Function() {
2     int i = 1; /* スコープの広いローカル変数 */
3     {
4         int j = 1; /* スコープの狭いローカル変数 */
5     }
6 }

C言語のローカル変数の寿命 (lifetime) は、デフォルトではそのローカル変数を定義した関数の呼び出しから抜けるまでである。関数の制御フローが呼び出し元に返り、スタック領域が解放されると、ローカル変数のメモリ領域は自動的に解放される。したがって「自動変数」とも呼ばれる。ローカル変数宣言にstaticキーワード(静的記憶クラス指定子)を付加すると、「静的ローカル変数」となり、変数寿命はプログラムの生存期間と同一となる。静的ローカル変数の初期化式は関数が最初に呼び出されたときに一度だけ評価され、その値によって変数は一度だけ初期化される。

C99の例を示す。なお、(1)はC言語およびC++03規格までのC++ではauto int a = 0;と等価だが、C++11以降はautoキーワードの意味が変更されたため、等価ではなくなった。

#include <stdio.h>

int Function1(void) {
    int a = 0; // (1) 通常のローカル変数(自動変数)の宣言と定義。初期化は関数を呼び出すたびに毎回行なわれる。
    a += 1;
    return a;
}

int Function2(void) {
    static int s = 0; // (2) 静的ローカル変数の宣言と定義。初期化は一度だけ行なわれる。
    s += 1;
    return s;
}

int main(void) {
    for (int i = 0; i < 5; ++i) {
        printf("auto(%d) = %d\n", i, Function1());
        printf("static(%d) = %d\n", i, Function2());
    }
    return 0;
}

Singleton パターンの実現に静的ローカル変数が利用されることがある。

C++ではローカル変数のスコープが終了するときにデストラクタが呼ばれる。

Java[編集]

Javaにおける変数7種類[要出典]ある。

Javaにおいては、メソッド内で宣言されている変数をローカル変数と呼ぶ。スコープの概念およびブロックの構文はC/C++とほぼ同様だが、C/C++と異なり、静的ローカル変数は定義できない。

下記の例において、3行目で宣言されているローカル変数iのスコープは3行目から7行目の中括弧までであり、5行目で宣言されているローカル変数jのスコープは5行目から6行目の中括弧までである。

1 class Foo {
2     void bar() {
3         int i = 1; // スコープの広いローカル変数
4         {
5             int j = 1; // スコープの狭いローカル変数
6         }
7     }
8 }

Javaのメモリ解放はガベージコレクションによって行なわれる。Javaのローカル変数はスタック領域に確保されるが、参照型の場合、オブジェクト本体はヒープ領域に作成される。ローカル変数の寿命が尽きて、その変数が指していたオブジェクトがまったく参照されなくなったとしても、そのオブジェクトのメモリ領域が直ちに解放されるとは限らない。

関連項目[編集]