天国にいけるC言語入門 ヘキサ構造体 ver3.2128
自14 static変数が用いられた自作関数が実行された後もstatic変数に格納された数値データは保存されますがローカル変数でもあるので main関数内で定義された同じ名前の変数には影響を与えません
自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をとりこみました。
ソーラー「おめでとうございま~す 正解で~す」
マックス「おお やったぜぇぇいぃ
のりぴ~ うれぴ~~」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます