C言語のスコープルール:ローカル、グローバル、仮パラメータの理解
スコープとは
プログラミングにおけるスコープとは、定義された変数が存在しうるプログラムの領域のことで、その領域を超えると変数にアクセスできません。Cプログラミング言語では変数を宣言できる場所は3箇所あります:
- 関数またはブロック内部 - ローカル変数と呼ばれる
- すべての関数の外部 - グローバル変数と呼ばれる
- 関数パラメータの定義内 - 仮パラメータと呼ばれる
ローカル変数とグローバル変数、仮パラメータが何であるか理解しましょう。
ローカル変数
関数またはブロック内で宣言された変数をローカル変数と呼びます。それらはその関数またはコードブロック内の文でのみ使用できます。ローカル変数は自分自身の関数の外部では知られていません。以下の例はローカル変数の使用方法を示します。ここではa、b、cすべてがmain()関数のローカル変数です。
Live Demo#include <stdio.h>
int main() {
/* ローカル変数宣言 */
int a, b;
int c;
/* 実際の初期化 */
a = 10;
b = 20;
c = a + b;
printf("value of a = %d, b = %d and c = %d\n", a, b, c);
return 0;
}
グローバル変数
グローバル変数は関数の外部、通常プログラムの冒頭で定義されます。グローバル変数はプログラムのライフタイム全体で値を保持し、プログラムで定義されたどの関数からでもアクセスできます。
グローバル変数はどの関数からでもアクセス可能です。つまり、宣言後はプログラム全体で使用できます。以下のプログラムはグローバル変数の使用方法を示します。
Live Demo#include <stdio.h>
/* グローバル変数宣言 */
int g;
int main() {
/* ローカル変数宣言 */
int a, b;
/* 実際の初期化 */
a = 10;
b = 20;
g = a + b;
printf("value of a = %d, b = %d and g = %d\n", a, b, g);
return 0;
}
プログラムはローカル変数とグローバル変数で同じ名前を持つことができますが、関数内でのローカル変数の値が優先されます。例:
Live Demo#include <stdio.h>
/* グローバル変数宣言 */
int g = 20;
int main() {
/* ローカル変数宣言 */
int g = 10;
printf("value of g = %d\n", g);
return 0;
}
実行結果:
value of g = 10
仮パラメータ
仮パラメータは関数内ではローカル変数として扱われ、グローバル変数より優先されます。例:
Live Demo#include <stdio.h>
/* グローバル変数宣言 */
int a = 20;
int main() {
/* main関数内のローカル変数宣言 */
int a = 10;
int b = 20;
int c = 0;
printf("value of a in main() = %d\n", a);
c = sum(a, b);
printf("value of c in main() = %d\n", c);
return 0;
}
/* 2つの整数を加算する関数 */
int sum(int a, int b) {
printf("value of a in sum() = %d\n", a);
printf("value of b in sum() = %d\n", b);
return a + b;
}
実行結果:
value of a in main() = 10 value of a in sum() = 10 value of b in sum() = 20 value of c in main() = 30
ローカル変数とグローバル変数の初期化
ローカル変数が定義されると、システムによって初期化されません。自分で初期化する必要があります。グローバル変数は定義時にシステムによって自動的に初期化されます:
| データ型 | 初期デフォルト値 |
|---|---|
| int | 0 |
| char | '\0' |
| float | 0 |
| double | 0 |
| pointer | NULL |
変数を適切に初期化することは良いプログラミング習慣です。そうでないと、未初期化変数はメモリ位置にすでにあるガベージ値を取るため、プログラムが予期せぬ結果を生む可能性があります。
C言語