0Pricing
C Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. auto とローカルスコープ
  2. static 変数
  3. extern とグローバル変数
  4. register と const
← C Academyに戻る