シャドゥイング【C言語】
関数hogeにおいてグローバル変数aに値を代入する例。これはシャドゥイングを行っていない。
code:global1.c
void hoge(void);
int a = 1; // グローバル変数
int main(void){
printf("前) %d\n", a);
hoge();
printf("後) %d\n", a);
return 0;
}
void hoge(void){
a = 2; // aはグローバル変数
return;
}
関数hoge内で新たな同名の変数aを宣言する例。
code:global2.c
void hoge(void);
int a = 1; // グローバル変数
int main(void){
printf("前) %d\n", a); // aはグローバル変数
hoge();
printf("後) %d\n", a); // aはグローバル変数
return 0;
}
void hoge(void){
int a; // ローカル変数aでグローバル変数aをシャドゥイングする
a = 2; // aはローカル変数
return;
}
forループブロックにおけるシャドゥイング
code:shadowing.c
int main(void){
int i = 999; // 変数i(MAIN)を宣言
printf("前:%d\n", i);
for(int i = 0; i < 10; i++){ // 変数i(FOR)を宣言
printf("%d ", i);
}
printf("\n後:%d\n", i);
return 0;
}
ここで
関数mainをスコープとする変数i を「i(MAIN)」
FORブロックをスコープとする変数iを「i(FOR)」
とよぶ。
1.関数mainの処理によって、i(MAIN)が作られる。
2.FOR文の処理が開始されるとi(FOR)が作られ、FORブロックの内側においてはi(MAIN)は隠される。
3.FOR文の処理が終了することで、i(FOR)はメモリから削除される。