🌞自作関数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をとりこみました。
となります。」
マックス「おおぅ 意外とグローバル変数と
ローカル変数のスコープの仕組みは奥深いな」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます