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



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


#include <stdio.h>


void f(void){

static int a=1;

printf("%dをとりこみました。\n",a);

a++;

}


int main(void){

f();

f();

f();

return 0;

}


プログラムの実行結果


1をとりこみました。

2をとりこみました。

3をとりこみました。


ソーラー「


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


このプログラムにおいて


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


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


ですが


次のプログラムのように

👇

#include <stdio.h>


void f(void){

static int a=1;

printf("%dをとりこみました。\n",a);

a++;

}


int main(void){

f();

f();

f();

printf("%dをとりこめるかな。\n",a);

return 0;

}


👆

f();

f();

f();

の次に


命令文

printf("%dをとりこめるかな。\n",a);をかきこんでも


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


なぜなら


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


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


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


自作関数fのブロック{}内で変数宣言されたローカル変数aは


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


main関数のブロック{}内で定義された変数a


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


自作関数fのブロック{}内で変数宣言static int a=1;が実行されて


static変数aが生成されることになっても


f();

f();

f();

の実行を経て


最終的に


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


main関数のブロック{}内でaは変数宣言されていないので


main関数のブロック{}内でaという名の変数は使用できません




自作関数fのブロック{}内でaが変数宣言されても


main関数のブロック{}内で変数aは変数宣言されたことにはなりません。


自作関数fのブロック{}内でaが変数宣言されても


main関数のブロック{}内でaが変数宣言されていない状態で


プログラムを実行したなら


main関数内の変数aが定義されていません



エラー表示がでてきます。


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


自作関数fとは別に


main関数のブロック{}内でも変数aを変数宣言しておけば

👇

#include <stdio.h>


void f(void) {

static int a = 1;

printf("%dをとりこみました。\n", a);

a++;

}


int main(void) {

f();

f();

f();

int a = 1;/*🌞🌞ここです🌞🌞*/


printf("%dをとりこみました。\n", a);//👈この命令文を実行することができます

return 0;

}


プログラムの実行結果


1をとりこみました。

2をとりこみました。

3をとりこみました。

1をとりこみました。


と無事に実行できますね。


aが定義されていませんというエラー表示は出なくなります


ならば・・・」


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


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


int a = 1;

f();

f();

f();

の前にもってきたなら


printf("%dをとりこみました。\n", a);

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


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

👇


#include <stdio.h>


void f(void) {

static int a = 1;

printf("%dをとりこみました。\n", a);

a++;

}


int main(void) {


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

f();

f();

f();

printf("%dをとりこみました。\n", a);//👈aにはどのような値が代入されるのでしょうか?

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のまま変化しない


つまり


printf("%dをとりこみました。\n", a);


の実行結果は


1をとりこみました


になる


どうだ?」


ソーラー「それでは😊


プログラムの実行結果は・・・


#include <stdio.h>


void f(void) {

static int a = 1;

printf("%dをとりこみました。\n", a);

a++;

}


int main(void) {


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

f();

f();

f();

printf("%dをとりこみました。\n", a);

return 0;

}


プログラムの実行結果


1をとりこみました。

2をとりこみました。

3をとりこみました。

1をとりこみました。


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


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


のりぴ~ うれぴ~~」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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