ホーム - プログラミング - スコープについて

スコープについて

変数や関数には有効範囲が存在します。プログラミング用語でスコープといいます。プログラミングにおいてソースコードを記述する際には、スコープが有効な変数や関数しか使用することができません。まずは下記に説明のためのサンプルを示します。

string x;
int y;

void FunctionA(string a, int b)
{
    string x1;
    int y1;
    int za;

    〜 ここにFanctionAの処理を記述 〜
}

void FunctionB(string a, int b)
{
    string x1;
    int y1;
    int zb;

    〜 ここにFanctionBの処理を記述 〜
}
				
上記のソースコードにおいて、変数xとyは関数FunctionAとFunctionBのどちらにも使用できるだけでなく、FunctionAで変更された値がFunctionBで使用する際に反映され、また逆にFunctionBで変更された値がFunctionAで使用する際に反映されます。すなわち変数xとyのスコープはFunctionAとFuncitonBのどちらにも及ぶということになります。

変数x1とy1、引数aとbはそれぞれの関数において宣言されています。ですので、変数名こそFunctionAとFunctionBで同じ名前で宣言されていますがプログラム上では全くの別物です。ですので、どちらの関数でも変数名としては同じものを使用できますが、スコープはそれぞれの関数内であるため、お互いの変更が影響を及ぼすことはありません。またFunctionAで宣言されている変数zaはx1やy1と同様にスコープがFunctionAの関数内であり、FunctionBの関数内では宣言されていないので、FunctionAの中だけでのみ使用できます。FunctionB内の変数zbについても同様です。

まとめますと、変数xとyのみが関数をまたがるスコープを持ち、それ以外の変数は全て関数内にのみスコープを持っています。各関数の中で変数xとyを宣言することも可能ですが、同じスコープ内に同じ名前の変数が複数あることはプログラムミスの元になりますのでやめましょう。ちなみに同じ変数名がある場合はスコープが近い方(この場合は関数内で宣言した方)が優先されます。

このように変数には宣言する場所によってスコープが変わるという特性があります。また、関数にも同様の概念があります。

プログラミングにおいてはスコープについて記述上のマナールールがあります。それはスコープは最小になるようにソースコードを記述するということです。初心者の中には「スコープが大きくなるように宣言すれば、宣言文が少なくなり良いのではないか」といった考え方を持つ方もいらっしゃいますが、それは全くの間違いです。プログラミングは人間がすることですので、プログラムミス(バグ)というものが必ず発生します。その際にスコープが大きな変数は影響範囲が必要以上に大きくなり、どこで書き換えられた値がバグの原因なのか突き止めるのに時間が掛かったり、構造化等でソースコードを整理する際にも大きな障害になります。このようにスコープが大きな変数は保守性を著しく低下させます。ですので、ソースコードのタイピングが面倒でも必要な箇所で都度、変数を宣言するように心掛けましょう。プログラミングにおいて最も労力の掛かる手間はバグの改修ですので、変数の宣言程度のタイピングの手間は惜しまないようにしましょう(ブラインドタッチは覚えておきましょう)。