自14 static変数が用いられた自作関数が実行された後もstatic変数に格納された数値データは保存されますがローカル変数でもあるので main関数内で定義された同じ名前の変数には影響を与えません

ソーラー「では 先程のつづき いきま~す🌞🌞🌞」


#include <iostream>


using namespace std;


void f(void){


static int a=1;


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


a++;


}


int main(){


f();

f();

f();

return 0;

}


ビルド実行結果は


1をとりこみました。

2をとりこみました。

3をとりこみました。


ソーラー「

前のエピソードでもご覧になられたように


このプログラムにおいて


自作関数f内で変数宣言されているローカル変数aの情報は


f();が実行されても消えることなく保持されつづけています。。


ですが


次のプログラムのように

👇

#include <iostream>


using namespace std;


void f(void){


static int a=1;


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

a++;


}


int main(){


f();

f();

f();

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


return 0;


}


👆

f();

f();

f();

の次に


の次に


命令文


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


をかきこんでも


このプログラムはビルドエラーがでて実行されません。


なぜなら


static変数宣言 static int a=1;をもちいて


自作関数fの変数aの情報が保持されても


いままでのローカル変数のルールどおり


自作関数f内で変数宣言されたローカル変数aは


変数名が同じaであっても


main関数の中で変数宣言され作製された変数a


とは別の変数ということになり


static int a=1;をもちいて


f();

f();

f();

の実行を経て


最終的に


自作関数f内で変数宣言されたstatic変数aに数値データ4が格納されることになっても


main関数内でaは変数宣言されていないので


main関数内でaという名の変数は使用できません



もうすこし 付け加えると


自作関数f内でaが変数宣言されても


main関数内の変数aは変数宣言されたことにはなりません。


自作関数f内でaが変数宣言されても


main関数内でaが変数宣言されていない状態でプログラムを実行しても



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

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



とビルドエラーが表示されます。


そこで次のプログラムのように


自作関数fとは別に


main関数内でも変数aを変数宣言しておけば


#include <iostream>


using namespace std;


void f(void) {


static int a = 1;


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

a++;


}


int main() {


f();

f();

f();

int a =1;

/*🌞🌞ここです🌞🌞*/

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


return 0;


}


ビルド実行結果


1をとりこみました。

2をとりこみました。

3をとりこみました。

1をとりこみました。


と無事にコンパイルできますね。


ならば・・・」


マックス「えっ続きがあるのか?」


ソーラー「このプログラムで


int a = 1;

f();

f();

f();

の前にもってきたなら


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

ビルド実行結果はどうなるとおもいますか?


そのプログラムはこちらです

👇


#include <iostream>


using namespace std;



void f(void) {

static int a = 1;

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

a++;

}


int main() {


int a = 1;/*🌞🌞ここです、ここにint a=1;を持ってきました🌞🌞*/

f();

f();

f();

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

return 0;

}


マックス「


int a = 1;

f();

f();

f();

の前にもってきたか・・・


f();

f();

f();

が実行されると


自作関数fのローカルstatic変数aに格納されている値は4となるが


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


main関数のブロック{}内で変数宣言された


変数aとは全く異なる別の変数だ


ということは


別の変数に格納されている値が4になったとしても


main関数のブロック{}内で変数宣言された


変数aに格納されている値は


int a=1;


が実行されたときに格納された数値データ1のまま変化しない


つまり


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


の実行結果は


1をとりこみました


になる


どうだ?」


ソーラー「それでは😊


ビルド実行結果は・・・


#include <iostream>


using namespace std;



void f(void) {

static int a = 1;

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

a++;

}


int main() {


int a = 1;/*🌞🌞ここです、ここにint a=1;を持ってきました🌞🌞*/

f();

f();

f();

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

return 0;

}

ビルド実行結果


1をとりこみました。

2をとりこみました。

3をとりこみました。

1をとりこみました。


ソーラー「おめでとうございま~す 正解で~す」


マックス「おお やったぜぇぇいぃ


のりぴ~ うれぴ~~」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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