自作関数12.5 妖精さんがプログラムを書き換えちゃった
ソーラー「
ローカル変数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の使用可能な範囲)内
となっていますね。
よって
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",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をとりこみました。
となります。」
マックス「おおぅ 意外とグローバル変数と
ローカル変数のスコープの仕組みは奥深いな」
ソーラー「ねえ みんな 天気がいいので外に遊びにいこうよ」
マックス「おお それいいじゃん」
アレサ「はい」
とっとこ
とっとこ
妖精「誰もいなくなった・・・
うふふ(*´艸`*)
ちょっとあそんでみよっか
みんなに
ばれないように
今のプログラム
👇
#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;
}
👆
を
#include <stdio.h>
int a=10;
int main(void){
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",a);
}
printf("%dをとりこみました。\n",a);
int a;//👈ここに注目
return 0;
}
に変更しちゃえ
うふふ」
しばらくして・・・
ソーラー「ただいま~
ふうっ炎天下のテニスはいいね
心も体も
超リフレッシュできるね
冷えたお茶、お茶」
マックス「いや~ テニス 面白かったな
いい感じで体を動かせたな」
アレサ「驚きました
運動って不思議です
体が入れ替わったみたいに
元気になるのですの」
余韻にひたってるソーラー達・・・
ソーラー「そうだ
もう1回
さっきの
プログラムを実行してみよっかなっと
・・・
おや?
なんか
おかしいな
main関数のブロック{}内の
aのローカル変数宣言
int a;
の
位置が
いつの間にか
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",a);
}
printf("%dをとりこみました。\n",a);
の下になってる!
これじゃあ
このプログラムの実行はできないね
だって
aのローカル変数宣言
int a;
によって生成される変数aの
スコープ(変数aの使用できる範囲)は
aのローカル変数宣言
int a;
が
行われた行以下の行
になるから
☆ ☆ ☆
図示すると以下のようになります
👇
#include <stdio.h>
int a=10;
int main(void){
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",a);
}
printf("%dをとりこみました。\n",a);
int a;//👇この行以下がローカル変数aのスコープとなります
return 0;
}
☆ ☆ ☆
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",a);
}
printf("%dをとりこみました。\n",a);
の
変数aは
定義されてないことになるよね
だから
プログラムを実行したら
aが定義されていません
って
エラーが表示されることになるんじゃない?
いつの間に・・・」
妖精「くすくす」
ソーラー達を隠れて見守る妖精
マックス「まあ
エラーが表示されるのをみるために
今のそのプログラムを実行してみるか
まあ 実行はできないと思うが・・・
👇
#include <stdio.h>
int a = 10;
int main(void) {
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
int a;
return 0;
}
プログラムの実行結果
1をとりこみました。
2をとりこみました。
3をとりこみました。
同時に
警告 C4101 'a': ローカル変数は 1 度も使われていません。
が表示されています
ソーラー「???
なぜ?
main関数のブロック{}内の
aのローカル変数宣言
int a;
の
位置が
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",a);
}
printf("%dをとりこみました。\n",a);
の下になってるのに
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",a);
}
printf("%dをとりこみました。\n",a);
が
実行されているの?
for(a=1;a<3;a++){
printf("%dをとりこみました。\n",a);
}
printf("%dをとりこみました。\n",a);
の
a
は
定義されていないはずなのに?」
アレサ「
同時に
警告 C4101 'a': ローカル変数は 1 度も使われていません。
が
表示されています
確かに
今のプログラム
👇
int main(void) {
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
int a;
return 0;
}
👆
の
aのローカル変数宣言
int a;
によって
作製された変数aは
1 度も使われていません。
ではなぜ
このプログラムは実行できて
プログラムの実行結果
1をとりこみました。
2をとりこみました。
3をとりこみました。
が
表示されているのでしょうか?」
マックス「
もしや
#include <stdio.h>
int a = 10;
int main(void) {
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
int a;
return 0;
}
の
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
の
aはmain関数のローカル変数a
でなく
グローバル変数a
なんじゃないか?
だって
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
は
グローバル変数宣言
int a = 10;
の
スコープ内に記述されているだろう
だから
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
は
実行できているってわけだ
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
の
aは
グローバル変数宣言
int a = 10;
に
よって生成された
グローバル変数aになっている
そうか
main関数のローカル変数aでなく
グローバル変数のa
ってわけだ
」
ソーラー「ああっ 本当だ
確かにそれなら
for (a = 1; a < 3; a++) {
printf("%dをとりこみました。\n", a);
}
printf("%dをとりこみました。\n", a);
が実行されて
プログラムの実行結果
1をとりこみました。
2をとりこみました。
3をとりこみました。
が
表示されることになるね」
妖精さんのドッキリ!💖でした
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます