🌞自作関数6 💃ローカル変数とは ある関数の中で変数宣言された変数のことです

ソーラー「さあ、どんどんいくぞっ


プロトタイプ宣言の次は・・・


ローカル変数だ!」


マックス「軽そう変数か


ワハハ😊


また俺の美しい技がふえるじゃないか」


ソーラー「ローカル変数です


関数の自作ができるようになったので


ローカル変数の説明もできるようになったんだ。


とりあえず


ローカル変数の説明もできるようになったんだけど


ローカル変数がどういうものなのかは


だんだんとわかってくると思うな。



(参照渡し、値渡しの エピソードでさらに詳しく理解できます)


ひとまず


          💃ローカル変数とは🐙


    🍅ある関数のブロック{}内で定義された変数🍅



のことなんだよ。


どういうことかというと


次のプログラムをみてみようよ。


🍓🍓🍓🍓🍓


#include <iostream>


using namespace std;


void f(void){


int a=1;


cout<<a<<"をとりこみました。\n";


}

int main()

{

f();

return 0;

}


ビルド実行結果


1をとりこみました。


🍓🍓🍓🍓🍓


このプログラムでは


int main(){ } (メイン関数)より前に


void f(void){


int a=1;


cout<<a<<"をとりこみました。\n";


}



自作関数fの定義が記述されています。


______________________________


ここで自作関数fの定義のブロック{}内に


int a=1;


をもってきました。


int a=1; とaの変数宣言と初期化をしているところが


ミソだね。 ふふっ ここで変数aを仕込んできましたよ(^^)


______________________________


そして


int main(){}(メイン関数)のブロック{}内のなかで


自作関数fを


f();


と呼び出してつかっているんだよね。


プログラムを実行すると


プログラムの実行結果は


1をとりこみました。


となります。


🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋


このように自作関数void f(void)を


main関数内で呼び出して使用するときは


f();


と記述します


数値などのデータを格納するための変数を引数として持っていないので


自作関数void f(void)と()の中はvoidになっているんだったね。


変数なら 変数aがあるじゃない?とおもわれるかもしれませんが


自作関数の定義

👇

void f(void){


int a=1;


cout<<a<<"をとりこみました。\n";


}



自作関数の定義

👇


void f(void){


cout<<1<<"をとりこみました。\n";


}


と 同等なのです



自作関数の定義

👇

void f(void){


cout<<1<<"をとりこみました。\n";

}

により


定義される自作関数f


が数値を受け取る変数aを引数にもたないのと同様に



自作関数の定義

👇

void f(void){


int a=1;


cout<<a<<"をとりこみました。\n";


}


により


定義される自作関数fは


数値を受け取る変数aを引数にもたないというわけです


よって


この


自作関数の定義

👇

void f(void){


int a=1;


cout<<a<<"をとりこみました。\n";


}


では


数値などのデータを受け取る変数が使われていないため


void f(void)と記述されています


void f(int a)とはなりません。


このvoid f(void)と定義された


自作関数fをmain関数内で呼び出して使用するときは


f();


と記述されます


もしvoid f(int a)タイプの自作関数なら


main関数内で呼び出して使用するときは


f(1);


などのように記述されます


このようにして


int aにより生成される変数aに


データを代入することになります


🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋🍋


ソーラー「


このプログラムは


普通に 自作関数をつかったプログラムだね。


ここまではいいかな?」


マックス「みゃあ~」


てんC「マックスさん、 おにゃんこが乗り移りかかっています」


ソーラー「では 次のプログラムを実行すると


どのような結果になるかな~\(^o^)/?


#include <iostream>


using namespace std;


void f(void){


int a=1;


cout<<a<<"をとりこみました。\n";


}


int main(){


f();

cout<<a<<"をとりこみました。\n";

return 0;


}


てんC「このプログラムは


自作関数f();を実行したあとで


cout<<a<<"をとりこみました。\n";


を実行するプログラムなのですね。」


ソーラー 「そう😊


マックス このプログラムのビルド実行結果は


どうなると思う、思う(^^)/」


マックス「にゃお(#^.^#) にゃおお~ん」


てんC「🐈さん 🐈さん おいしいお菓子ですよ~」


❔🐈「にゃ~  むしゃむしゃ・・・」


❔🐈「う~ん


int main(){}(メイン関数)のブロック{}のなかで


f();

cout<<a<<"をとりこみました。\n";


が実行されるのだから


ビルド実行結果は


1をとりこみました。

1をとりこみました。


となるのじゃないかにゃ?」


ソーラー「おおぅ・・・ぼけてる・・ちゃんと」


てんC 「え? 


プログラムの実行結果は


1をとりこみました。

1をとりこみました。


にならないのですか?」


ソーラー『正解は


次のようなビルドエラーがでるんだ。



エラー C2065 'a': 定義されていない識別子です。

エラー (アクティブ) E0020 識別子 "a" が定義されていません


てんC「識別子 "a" が定義されていません


ですか・・・


一番最初の🍓🍓🍓🍓🍓のプログラムでは


普通にビルド実行結果は


1をとりこみました。と表示されたのに


どのような仕組みになっているのでしょうか」


ソーラー 「そう これが ローカル変数なんです。


つまり


自作関数f()のなかで変数宣言、初期化された変数aは


別の関数であるmain関数の内部では使用できないんだ。


だから


main関数のなかで、ただ単に


cout<<a<<"をとりこみました。\n";


と記述しただけでは


main関数のなかで


aの変数宣言がおこなわれていないことになり


コンピュータは変数aを認識できず、ビルドエラーになるんだね。


だから 今のプログラムは 


次のプログラムのように


自作関数f(){}のブロック{}内での


aの変数宣言、初期化とは別に


main関数のブロック{}内でaの変数宣言と初期化を行う必要があります


#include <iostream>


using namespace std;


void f(void){


int a=1;


cout<<a<<"をとりこみました。\n";

}


int main()


{


int a=1;//🌞ここです aの変数宣言、初期化を実行しています


f();

cout<<a<<"をとりこみました。\n";


return 0;


}


プログラムの実行結果


1をとりこみました

1をとりこみました


てんC「同じ変数名aなのに


自作関数fのローカル変数a



main関数のローカル変数a


とは


異なる変数となるのですね


不思議な仕組みですね」


マックス「にゃ~~~」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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