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

🌞自作関数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;

👈}


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


では


次のプログラムの


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


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


グローバル変数も

ローカル変数も


ともに変数名がaとなっています




#include <stdio.h>


int a=10;


int main(void){

int a=1;

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

return 0;

}


プログラムの実行結果


1をとりこみました。


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


int a=10;


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


ソーラー「


このaのグローバル変数宣言


int a=10;


によって作製されたグローバル変数aのスコープ(グローバル変数aの使用可能な範囲)


グローバル変数宣言


int a=10;


が行われた行以下の行になります。


ですが


ここで



          🌞 大注目 🌞



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


aのローカル変数宣言


int a=1;


が行われています。


ローカル変数aのスコープは


main関数の{  }ブロック内となります


int a=10;

のグローバル変数aと


int a=1;

のローカル変数aは


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


このとき


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


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


同時に


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


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


でもあります。


このとき


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


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

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


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



そのため

main関数のブロック{  }内で記述されている


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


a

main関数のローカル変数宣言

int a=1;

の影響をうけて


1の値をもつことになります


そのことを示すプログラムはこちらとなります」

👇

#include <stdio.h>


int a=10;


int main(void){

int a=1;

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

return 0;

}


ビルド実行結果は


1をとりこみました。


ソーラー「main関数のブロック{}内の命令文


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


a

main関数内のローカル変数宣言

int a=1;

の影響をうけて


1の値をもっているのがわかりますね


では


次のプログラムでは


グローバル変数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;

}


👆

みなさん このプログラムのビルド実行結果が


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


ポイントは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のmain関数のローカル変数宣言


int a;


が行われています。


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


main関数のブロック{}内となります



となると


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


aのグローバル変数宣言


int a=10;


によって作成された


グローバル変数a


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


aのローカル変数宣言


int a;


によって作製された


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


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


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


優先して


aのmain関数のローカル変数宣言の影響を受けることになり


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


aのint型のローカル変数宣言


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;

👈}



この

int a;の行以下の👉から👈までが


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


となります。


そのため

main関数のブロック{}内の命令文


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

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

}


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



a



すべてmain関数のローカル変数aをあらわすことになります


このプログラムで

ローカル変数宣言

int a;


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


その次の命令文

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

により

a=1により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はmain関数のローカル変数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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る