🌞自作関数12 グローバル変数宣言とローカル変数宣言のスコープ(変数宣言により作製された変数の使用可能な範囲)を考察してみましょう。

アレサ


「次のプログラムの


グローバル変数とローカル変数のスコープを早速調べてみませんか


#include <stdio.h>


int a=10;


int main(void){

int b=1;

printf("%dをとりこみました。\n",b);

return 0;

}


コンパイル結果

1をとりこみました。


マックス「簡単、簡単


関数の外で変数宣言された変数aはグローバル変数


main関数内で宣言された変数bはローカル変数なんだろう。


グローバル変数aのスコープ(グローバル変数aの使用可能な範囲)


は


aのグローバル変数宣言


int a=10;


が行われた行以下


図で示すと


👇以下がグローバル変数aのスコープとなる。


#include <stdio.h>


int a=10;👇


int main(void){

int b=1;

printf("%dをとりこみました。\n",b);

return 0;

}



ローカル変数bのスコープ(ローカル変数bの使用可能な範囲)


は


bのローカル変数宣言


int b;


が行われたブロック{}内となる。


図で示すと


👉👈内がローカル変数bのスコープとなる。


#include <stdio.h>


int a=10;


int main(void){

int b=1;👉

printf("%dをとりこみました。\n",b);

return 0;

👈}


アレサ「そうなんですの。


では


次のプログラムの


グローバル変数とローカル変数のスコープは


どうなっているのでしょうか?




#include <stdio.h>


int a=10;


int main(void){

int a=1;

printf("%dをとりこみました。\n",a);

return 0;

}


コンパイル結果

1をとりこみました。


マックス「にゃはは 簡単 簡単


int a=10;


のaはグローバル変数なんだろう」


ソーラー「


このグローバル変数宣言


int a=10;


によって作製されたグローバル変数aは


グローバル変数宣言


int a=10;


が行われた以下の行が


スコープ(グローバル変数aの使用可能な範囲)になります。


ですが


ここで



          🌞 大注目 🌞



このプログラムではmain関数の{  }ブロック内で


aのローカル変数宣言


int a=1;


が行われています。


int a=1;

のローカル変数aと


int a=10;

のグローバル変数aは


同じaでも違う変数とコンピュータには認識されています。


このとき


main関数の{  }ブロック内は


グローバル変数aのスコープ(グローバル変数aの使用可能な範囲)であり


同時に


int a=1;によって宣言された


ローカル変数aのスコープ(ローカル変数aの使用可能な範囲)


でもあります。


main関数の{  }ブロック内で変数宣言


int a=1;


がおこなわれたなら


main関数の{  }ブロック内に記述されている変数aは


aのグローバル変数宣言よりも

aのローカル変数宣言が優先され


その変数aはローカル変数aとみなされます。



そのため

printf("%dをとりこみました。\n",a);

は

int a=1;

の影響をうけて


プログラム


#include <stdio.h>


int a=10;


int main(void){

int a=1;

printf("%dをとりこみました。\n",a);

return 0;

}

のコンパイル結果は


1をとりこみました。


となります。



では次のプログラムでは


グローバル変数とローカル変数のスコープ(変数の使用可能な範囲)


はどうなっているかな?



#include <stdio.h>


int a=10;


int main(void){

int a;

for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}

printf("%dをとりこみました。\n",a);

return 0;

}



みなさん このプログラムのコンパイル結果が


どうなるか予想してみませんか


ポイントはfor文

👇

for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}


の実行にともなって

増加した変数aに格納されている値は


for文が実行されたその後も


維持されて


for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}


の次の命令文

printf("%dをとりこみました。\n",a);


の変数aに影響をあたえるかどうかということなのですが・・・



                 solarplexussより


マックス「おおこ、これは・・・


こ、これはぁぁぁ


int a=10;


このaはグローバル変数ではないかぁぁ」


アレサ「ふ ふふ そうなんです


int a=10;


のaはグローバル変数なんです。


グローバル変数宣言は


それ以下の行に現れる変数aに影響を与えることになりますの


つまり


グローバル変数宣言が行われた以下の行がグローバル変数aのスコープと

なります」


ソーラー

「ですが


ここで



          🌞 大注目 🌞



このプログラムではmain関数の{  }ブロック内で


aのローカル変数宣言


int a;


が行われています。


このため


main関数の{  }ブロック内は


aのグローバル変数宣言


int a=10;


によって作成された


グローバル変数a


のスコープ(グローバル変数aの使用可能な範囲)でもあり


aのローカル変数宣言


int a;


によって作製された


ローカル変数aのスコープ(ローカル変数aの使用可能な範囲)でもあるのですが


main関数の{  }ブロック内に記述された変数aは


aのローカル変数宣言の影響を受け


ローカル変数aとみなされます。


aのローカル変数宣言

int a;


によって作製された


ローカル変数a

のスコープ(ローカル変数aの使用可能な範囲)


はどうなっているのかを図でしめせば


ぶーにゃん「し、しめ🐟(さば)」


#include <stdio.h>


int a=10;


int main(void)

{int a;👉

for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}

printf("%dをとりこみました。\n",a);

return 0;

👈}



この👉から👈までが


ローカル変数aのスコープ(ローカル変数aの使用可能な範囲)


となります。


このプログラムで


int a;


の段階ではローカル変数aは初期化されていませんが


その次の命令文

for(a=1;a<3;a++)

により

a=1が代入され初期化されています


命令文

for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}

が実行されると


コンパイル結果は

1をとりこみました。

2をとりこみました。


が表示されますが


この時


ローカル変数aに格納されている値は1から2に変化しているのではなく


実は


3にまで変化しているんです。


for文


for(a=1;a<3;a++)


において


aの値は増加していくのですが


aの値に3が格納されてから


a<3の条件式の判定により


for文は内部の{}ブロック内の


printf("%dをとりこみました。\n",a);


の繰り返しをストップするのです。


ですので


ローカル変数aに格納されている値は3にまで増加しています」


マックス「そ、そうだったのか・・・」


ソーラー「


ローカル変数aのスコープ(ローカル変数aの使用可能な範囲)

は

int main(void)

{👉int a;

for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}

printf("%dをとりこみました。\n",a);

return 0;

👈}


を見ていただくとおわかりになられますように


👉から👈の範囲が

ローカル変数aのスコープ(ローカル変数aの使用可能な範囲)


となっています。


ですので


命令文

for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}

だけでなく


その次の命令文


printf("%dをとりこみました。\n",a);


もローカル変数aのスコープ(ローカル変数aの使用可能な範囲)


となっていますね。


よって


printf("%dをとりこみました。\n",a);内の


変数aはローカル変数aとなります


for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}

の実行後


ローカル変数aに格納されている値は3になっているので


その次の命令文


printf("%dをとりこみました。\n",a);


のなかの変数aはローカル変数aであり3の値をもつことになるので


printf("%dをとりこみました。\n",a);


が実行されると


コンパイル結果


3をとりこみました


がコマンドプロンプト画面に表示されます。


そのようなわけで


#include <stdio.h>


int a=10;


int main(void)

{int a;

for(a=1;a<3;a++){

printf("%dをとりこみました。\n",a);

}

printf("%dをとりこみました。\n",a);

return 0;

}


のコンパイル結果は


1をとりこみました。

2をとりこみました。

3をとりこみました。


となります。」


マックス「おおぅ 意外とグローバル変数と


ローカル変数のスコープは奥深いな」



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます