自作関数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をとりこみました。



表示されることになるね」



妖精さんのドッキリ!💖でした





































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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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