4 関数と変数のスコープの関係

4.1 宣言の場所と有効範囲

変数はデータを記憶するためのもの--記憶領域に名前をつけたもの--である.その変数 は,宣言する場所によって有効範囲が異なる.この有効範囲のことをこれを変数のスコー プ(scope:範囲)という.有効範囲というのは,プログラム中で変数が使える場所のことで ある.具体的には,その変数を使って計算したり,表示することができる範囲で
printf("%f", hogehoge);
 

のように書いてもエラーにならない範囲である.

変数を宣言する場所,次の3箇所と考えてよい.

この3つの変数宣言の場所とスコープの関係をを図4に示す.これをしっか り理解せよ.

これが理解できたならば,図4のプログラムの実行結果が,以下のように なることが分かるであろう.自分でこのプログラムの動作を追ってみよ.



\fbox{実行結果}

fuga at main = 222
hoge at main = 111
foo at test = 333
foo at test = 111
bar at for loop = 444
bar at for loop = 444
図 4: 変数のスコープ(有効範囲)
\includegraphics[keepaspectratio, scale=1.0]{figure/scope.eps}

4.2 優先順位

どのような理由で,変数は宣言する場所でスコープが異なるのであろうか?.ちょっと考 えると,グローバル変数だけでよいように思える.小さなプログラムであれば,グローバ ル変数だけでよい.実際,グローバル変数しかないプログラミング言語もある.このよう なプログラミング言語は,大きなプログラムを作ることは不可能で,ちょっとした小さな プログラム専用である.なぜならば,グローバル変数だけだと,同じ変数名を使うことが できず,変数名の命名に大変苦労する.C言語のように宣言する場所で,変数のスコープ が異なると,同じ変数名を使うことができる.メイン関数で「hogehoge」と言う変 数を使っていても,他のユーザー定義関数などで「hogehoge」を使っても,異なっ た物として取り扱ってくれる.これは,便利な機能で複数のプログラマーがそれぞれ関数 を作成してひとつのプログラムを作る場合,各人が勝手な変数名を使うことができる.最 初の疑問「変数宣言の場所でスコープが異なる理由?」の答えは,同じ変数名を使 えることにするためで,それにより大規模なプログラムが開発できるようにしている.

それでは,「グローバル変数とローカル変数で同じ変数名を使った,どちらが実際使われ るのか?」ということになる.そのため,同じ変数名には優先順位がある.優先度の高い 順に並べると,(1)ブロック内宣言の変数,(2)ローカル変数,(3)グローバル変数となる.



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年5月30日


no counter