トップページへ

変数のスコープ

変数はスコープを持つ

変数にはそれが使える範囲というものがあり、これを 変数のスコープ と言います。例をもとに説明します。

int outer = 0;

if( true ){
  int inner = 1;
  println( inner ); // 1と表示される
  println( outer ); // 0と表示される
}

println( inner ); // エラー:この場所で変数 inner は使えない
println( outer ); // 0と表示される

このプログラムを実行しようとすると、9行目の部分でエラーが出てプログラムが実行できません(この行を削除すれば実行できる)。

 変数は、それが宣言されたブロックの中でしか使えないという性質があるために、このようなことが起こります。inner という変数は if 文の中で宣言されています。そのため、この変数は if 文の中( if ブロックの中)でしか使うことができません。9行目は if ブロックの外側であるため、inner 変数をその外側に持ち出すことはできないのです(プログラムの処理がブロックを抜けると、その時点でブロック内で宣言された変数は利用できなくなり、メモリからもやがて消去されます)。

 変数が使える範囲のことをスコープと呼び、上記の例ですと inner 変数のスコープは if 文の中、具体的にはプログラムコードの4〜6行目ということになります。同じ変数をスコープを超えて使うことはできません。

 ブロックを構成するのは if や for や while などの制御文の他、関数も同様です。

void setup(){
  int a = 1; // a は setup 関数内で宣言された変数である
}

void draw(){
  println( a ); // エラー:この場所で変数 a は使えない
}

変数 a は setup 関数内で宣言されているため、draw 関数内で使うことはできません。関数の中で宣言された変数は、その関数の中だけでしか使用できないのです。

グローバル変数とローカル変数

プログラムコード内のどの場所からでも利用できる変数が欲しい場合は、どの関数にも属さない場所で変数を宣言します。以下に例を示します。

int a = 2; // a はグローバル変数となる

void setup(){
  a = a * 3; // 関数内で変数 a が使える
  int b = 10;
}

void draw(){
  println(a); // 6と表示される
  exit(); // プログラムを終了する
}

このプログラムコード内には2つの関数があります。変数 a はそのどちらにも属さない場所で宣言されているため、プログラムコード内の全ての場所がスコープになります。そのため、setup 関数や draw 関数内で a を使うことができます。

 このような、プログラムコード内のどの場所からでも利用できる変数のことを グローバル変数 と呼びます。一方、setup 関数内の変数 b はその関数内でしか使用できず、そのような変数は ローカル変数 と呼ばれます。Processing のシステム変数もグローバル変数です。