🌞自作関数7 ローカル変数とは ある関数の中で定義された変数のことです その2
アレサ 「👇のプログラムの
🍊自作関数void f(void)の定義のブロック{}内🍊で
変数宣言&初期化
int a=1;
が記述されていますが
🍎 main 関数内で🍎
自作関数
f();
が実行されて
自作関数fの定義内の
int a=1;
printf("%dをとりこみました。\n",a);
が実行されても
main関数内の
f();
に
つづく命令文
printf("%dをとりこみました。\n",a);
の変数aには
自作関数fの定義内の
int a=1;
は影響を与えないということですか・・・
(自作関数内で変数宣言された変数aがmain関数内で有効でない)
とりあえず
👇のプログラムをごらんください↓
。。。。。。。。。。。。。。。。。。
#include <stdio.h>
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
int main(void)
{
f();
printf("%dをとりこみました。\n",a);//👈ここに注目
return 0;
}
ビルド実行結果
ビルドエラー
main関数内のaが定義されていません。が表示されます。
。。。。。。。。。。。。。。。。。
アレサ「では
ビルドエラーが出ないようにこのプログラムを修正してみます
いかがですか?ソーラーさん!!」
そのプログラムはこちらです
👇
#include <stdio.h>
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
int main(void){
f();
int a=2;//👈aの変数宣言、初期化を実行しました
printf("%dをとりこみました。\n",a);
return 0;
}
プログラムの実行結果
1をとりこみました。
2をとりこみました。
ソーラー 「ぷるっぷるっぷるっ
ああっ ううぅ
美しい・・・ぷるっぷるっぷるっ
ぴくぴくぴく
ううっとっ TTTrebian!」
アレサ 「ソーラーさん 痙攣してます!。」
ソーラー 「ううっ そう おおっと
自作関数
f();
が実行されて
自作関数void f(void)の定義内の
int a=1;
printf("%dをとりこみました。\n",a);
が実行されても
この
int a=1;は
main 関数内の
printf("%dをとりこみました。\n",a);の変数aには
影響を与えないように
つまり
ある
関数内で定義された変数は
他の関数内で使用できないのなら
main 関数内で
int a=2;と
変数宣言された変数aは
それは自作関数void f(void)内の
変数宣言
int a=1;
によって作られた変数aとはちがう
全く新たにつくられた別の変数aということになるよね。
つまり
自作関数void f(void){}のブロック{}内のint a=1;と
main 関数のブロック{}内の int a=2;とは
同じaという変数名でもお互い独立した変数ということになるよ
ぴくぴくっ・・・・・ね・・・
う、うつくしい・・・」
アレサ「それでは親戚でもないんですか?」
ソーラー 「そうなるよね」
アレサ「それでは お茶目な双子でもないんですか?」
ソーラー 「よね」
アレサ「それでは
こんなプログラムはいかがですか?ソーラーさん!!」
ソーラー「むむぅ」
アレサ
「
#include <stdio.h>
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
int main(void){
int a=2;
f();
printf("%dをとりこみました。\n",a);
return 0;
}
プログラムの実行結果
1をとりこみました。
2をとりこみました。
ねえ、ソーラーさん(^^)」
ソーラー「???
前のプログラムとちょっとちがう。
今度はさきほどのプログラムと違い
main関数内で
int a=2;
を
自作関数を実行する命令文
f();
の前にもってきてるね
自作関数を実行する命令文
f();
が実行されると
自作関数void f(void)の定義内の
int a=1;
printf("%dをとりこみました。\n",a);
が実行されることになりますが
int a=1;
printf("%dをとりこみました。\n",a);
が
main関数内で
実行される
int a=2;
の影響をうけるかどうか確かめようとしたのかな
これは・・・
うふふふ
int main(void){
f();
int a=2;//👈aの変数宣言、初期化を実行しました
printf("%dをとりこみました。\n",a);
return 0;
}
と記述しても
今のプログラムのように
int main(void){
int a=2;//👈aの変数宣言、初期化を実行しました
f();
printf("%dをとりこみました。\n",a);
return 0;
}
と記述しても
自作関数void f(void){}のブロック{}内のint a=1;によって生成された変数a
と
main 関数のブロック{}内の int a=2;によって生成された変数a
は
💖同じaという変数名💖
でもお互い独立した変数なんだ(*´▽`*)
だから
int a=2;//👈aの変数宣言、初期化を実行しました
f();
と記述しても
f();
の実行においては
int a=2;
の影響をうけないんだね
ですから
f();
が実行されると
1をとりこみました。
と
ビルド実行結果に表示されます。
それに
自作関数fの定義を見ると
👇
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
引数部分の()内がvoidとなっているので
自作関数fの実行時は
f();
と記述されることになります
f();
が実行されると
自作関数fの定義内の
👇
void f(void){
int a=1;
printf("%dをとりこみました。\n",a);
}
👆
int a=1;
printf("%dをとりこみました。\n",a);
が実行されることになり
1をとりこみました
が表示されることになりますが
もちろん
main関数内の
int a=2;
の影響はうけません
そもそも
f()は引数を持たない自作関数なので
f();
の実行において
main関数内の
int a=2;
の影響をうけることは
あったとしても(ほんとはないです)そもそも最初からないんだ
おまけ グレードアップ解説のコーナーです
もっと先のエピソードのお話が先取りされています💖
もし
自作関数fの定義が
👇
void f(int d){
int a=1;
a=d;
printf("%dをとりこみました。\n",a);
}
となっているとします
この自作関数を実行する場合
f(2);
のように実行することになります
この場合
2をとりこみました。
が
表示されることになります
この自作関数を実行する場合
数値だけでなく
main関数内でint a=2;と定義された変数aを
f(a);
のように
代入して実行することができます
引数のint dにmain関数のint a=2;によって生成される変数aを代入するという形で
自作関数fを
f(a);
と実行したなら
dにaが代入されるので
int a=2;の影響をうけるかもしれないけど
それでも
main 関数内で
int a=2;
と
変数宣言された変数aと
自作関数void f(void)内の
変数宣言
int a=1;
によって作られた変数a
は
それぞれ異なる変数なんです
」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます