Cprogramming-c-scope-rules
C-スコープルール
プログラミングのスコープとは、定義された変数が存在し、その変数を超えてアクセスできないプログラムの領域です。 Cプログラミング言語で変数を宣言できる場所は3つあります-
local 変数と呼ばれる関数またはブロック内。
global 変数と呼ばれるすべての関数の外側。
formal パラメータと呼ばれる関数パラメータの定義。
*local* および *global* 変数、および *formal* パラメーターについて理解しましょう。
ローカル変数
関数またはブロック内で宣言される変数は、ローカル変数と呼ばれます。 それらは、その関数またはコードブロック内にあるステートメントでのみ使用できます。 ローカル変数は、自身の外部の関数には認識されません。 次の例は、ローカル変数の使用方法を示しています。 ここで、変数a、b、およびcはすべてmain()関数に対してローカルです。
#include <stdio.h>
int main () {
/*local variable declaration*/
int a, b;
int c;
/*actual initialization*/
a = 10;
b = 20;
c = a + b;
printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
return 0;
}
グローバル変数
グローバル変数は、関数の外側、通常はプログラムの上部で定義されます。 グローバル変数は、プログラムの存続期間を通じてその値を保持し、プログラムに定義された関数のいずれかからアクセスできます。
グローバル変数には、どの関数からもアクセスできます。 つまり、グローバル変数は、宣言後、プログラム全体で使用できます。 次のプログラムは、プログラムでグローバル変数がどのように使用されるかを示しています。
#include <stdio.h>
/*global variable declaration*/
int g;
int main () {
/*local variable declaration*/
int a, b;
/*actual initialization*/
a = 10;
b = 20;
g = a + b;
printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
return 0;
}
プログラムはローカル変数とグローバル変数に同じ名前を付けることができますが、関数内のローカル変数の値が優先されます。 ここに例があります-
#include <stdio.h>
/*global variable declaration*/
int g = 20;
int main () {
/*local variable declaration*/
int g = 10;
printf ("value of g = %d\n", g);
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
value of g = 10
正式なパラメーター
仮パラメータは、関数内のローカル変数として扱われ、グローバル変数よりも優先されます。 以下は例です-
#include <stdio.h>
/*global variable declaration*/
int a = 20;
int main () {
/*local variable declaration in main function*/
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;
}
/*function to add two integers*/
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
ローカル変数とグローバル変数の初期化
ローカル変数が定義されると、システムによって初期化されません。自分で初期化する必要があります。 グローバル変数は、次のように定義すると、システムによって自動的に初期化されます-
Data Type | Initial Default Value |
---|---|
int | 0 |
char | '\0' |
float | 0 |
double | 0 |
pointer | NULL |
変数を適切に初期化することをお勧めします。そうしないと、初期化されていない変数がメモリ位置で既に利用可能なゴミ値を取得するため、プログラムが予期しない結果を生成する可能性があります。