変数はデータを記憶するためのもの--記憶領域に名前をつけたもの--である.その変数
は,宣言する場所によって有効範囲が異なる.この有効範囲のことをこれを変数のスコー
プ(scope:範囲)という.有効範囲というのは,プログラム中で変数が使える場所のことで
ある.具体的には,その変数を使って計算したり,表示することができる範囲で
printf("%f", hogehoge);
のように書いてもエラーにならない範囲である.
変数を宣言する場所,次の3箇所と考えてよい.
- 全ての関数の外側,プログラムの先頭付近で宣言した変数は全ての関数で有効である.
これをグローバル変数と呼ぶ.
- 関数の先頭で宣言した変数は,その関数内のみで有効である.これを,ローカ
ル変数と呼ぶ.また,関数の仮引数もローカル変数である.
- コードブロック--{ }で囲まれた部分5--の先頭で宣言した変数は,そのブロック内のみで有効になる.こ
れもローカル変数のひとつであるが,ここではブロック内宣言の
変数と呼ぶことにする.
この3つの変数宣言の場所とスコープの関係をを図
4に示す.これをしっか
り理解せよ.
これが理解できたならば,図4のプログラムの実行結果が,以下のように
なることが分かるであろう.自分でこのプログラムの動作を追ってみよ.
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
どのような理由で,変数は宣言する場所でスコープが異なるのであろうか?.ちょっと考
えると,グローバル変数だけでよいように思える.小さなプログラムであれば,グローバ
ル変数だけでよい.実際,グローバル変数しかないプログラミング言語もある.このよう
なプログラミング言語は,大きなプログラムを作ることは不可能で,ちょっとした小さな
プログラム専用である.なぜならば,グローバル変数だけだと,同じ変数名を使うことが
できず,変数名の命名に大変苦労する.C言語のように宣言する場所で,変数のスコープ
が異なると,同じ変数名を使うことができる.メイン関数で「
hogehoge」と言う変
数を使っていても,他のユーザー定義関数などで「
hogehoge」を使っても,異なっ
た物として取り扱ってくれる.これは,便利な機能で複数のプログラマーがそれぞれ関数
を作成してひとつのプログラムを作る場合,各人が勝手な変数名を使うことができる.最
初の疑問「
変数宣言の場所でスコープが異なる理由?」の答えは,同じ変数名を使
えることにするためで,それにより大規模なプログラムが開発できるようにしている.
それでは,「グローバル変数とローカル変数で同じ変数名を使った,どちらが実際使われ
るのか?」ということになる.そのため,同じ変数名には優先順位がある.優先度の高い
順に並べると,(1)ブロック内宣言の変数,(2)ローカル変数,(3)グローバル変数となる.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成19年5月30日