static 変数
保持されるローカル変数です。
「static 変数」はCoddyKit上の無料C Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
staticキーワード
staticローカル変数は、関数の呼び出し間でも値を保持します。存続期間はプログラム全体です。
#include <stdio.h>
void f(void) {
static int count = 0;
count++;
printf("count = %d\n", count);
}
int main(void) {
f();
f();
f();
return 0;
}一度だけ初期化
static変数は、関数が実行される最初の一度だけ初期化されます。2回目以降の呼び出しでは、初期化子は実行されません。
#include <stdio.h>
void f(void) {
static int x = 100;
printf("x = %d\n", x);
x += 10;
}
int main(void) {
f();
f();
return 0;
}デフォルトは0
auto変数とは異なり、初期化子のないstatic変数は0から始まります。
#include <stdio.h>
void f(void) {
static int n;
printf("n = %d\n", n);
n++;
}
int main(void) {
f();
f();
return 0;
}呼び出し回数を数える
典型的な用途は、関数が何回呼び出されたかを数えることです。
#include <stdio.h>
int nextId(void) {
static int id = 0;
return ++id;
}
int main(void) {
printf("%d %d %d\n", nextId(), nextId(), nextId());
return 0;
}staticの存続期間とローカルスコープ
staticローカル変数にもローカルスコープがあります。参照できるのはその関数だけですが、呼び出しをまたいで値を保持します。
#include <stdio.h>
void tick(void) {
static int t = 0;
t++;
printf("tick %d\n", t);
}
int main(void) {
tick();
tick();
return 0;
}staticとautoの比較
比較してみましょう。autoのカウンターは呼び出しごとにリセットされますが、staticのカウンターは値を累積します。
#include <stdio.h>
void autoCounter(void) {
int c = 0;
c++;
printf("auto: %d\n", c);
}
int main(void) {
autoCounter();
autoCounter();
return 0;
}ファイルスコープでのstatic
ファイルスコープでは、staticは内部リンケージを意味します。変数はそのソースファイル内だけで使える非公開のものになります。
#include <stdio.h>
static int secret = 7;
int main(void) {
printf("secret = %d\n", secret);
return 0;
}staticによるキャッシュ
static変数を使うと、計算結果を保存し、計算を一度だけ実行できます。
#include <stdio.h>
int getBase(void) {
static int base = 0;
if (base == 0) {
base = 50;
printf("computed once\n");
}
return base;
}
int main(void) {
printf("%d\n", getBase());
printf("%d\n", getBase());
return 0;
}状態の累積
staticローカル変数を使うと、グローバル変数なしで関数に累計値を記憶させられます。
#include <stdio.h>
int addToTotal(int v) {
static int total = 0;
total += v;
return total;
}
int main(void) {
printf("%d\n", addToTotal(10));
printf("%d\n", addToTotal(5));
return 0;
}注意点
staticな状態を使うと、関数が過去の実行履歴に依存するため、テストが難しくなることがあります。意図を持って使ってください。
#include <stdio.h>
int stepNumber(void) {
static int s = 0;
return ++s;
}
int main(void) {
printf("step %d\n", stepNumber());
printf("step %d\n", stepNumber());
return 0;
}ループとの組み合わせ
ループ本体内のstaticローカル変数は、反復の間だけでなく、関数の呼び出しをまたいでも値を保持します。
#include <stdio.h>
void run(void) {
static int seen = 0;
for (int i = 0; i < 2; i++)
seen++;
printf("seen = %d\n", seen);
}
int main(void) {
run();
run();
return 0;
}理解度チェック
static変数について理解できているか確認しましょう。
まとめ:static変数
値を保持するローカル変数について学びました。
staticローカル変数はプログラム全体にわたって存在する- 一度だけ初期化され、デフォルト値は0
- ローカルスコープを保ちながら値を保持する
- ファイルスコープでは
staticによって内部リンケージになる - カウンターやキャッシュに適している
よくある質問
「static 変数」レッスンは無料ですか?
はい。「static 変数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「static 変数」で何を学びますか?
保持されるローカル変数です。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「static 変数」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。