自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


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


static int a=1;をもちいて


f();

f();

f();

の実行を経て


最終的に


自作関数内の変数aに保存されることになる


自作関数内の変数a=4のデータ情報を


main関数内の変数aは


うけつぎません。


もうすこし 付け加えると


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


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


そこで この状態でプログラムを実行しても


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


とコンパイルエラーがでてきます。


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


自作関数とは別に


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をとりこみました。


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

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

作者を応援しよう!

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

応援したユーザー

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