🌞自作関数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
とは
異なる変数となるのですね
不思議な仕組みですね」
マックス「にゃ~~~」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます