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



それぞれ異なる変数なんです




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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