0Pricing
C Academy · Урок

static-переменные

Сохраняющиеся локальные переменные

«static-переменные» — бесплатный урок C Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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;
}

Инициализация один раз

Статическая переменная инициализируется только при первом выполнении функции. При последующих вызовах инициализатор пропускается.

#include <stdio.h>
void f(void) {
    static int x = 100;
    printf("x = %d\n", x);
    x += 10;
}
int main(void) {
    f();
    f();
    return 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

Статические переменные могут кэшировать вычисленное значение, чтобы вычислять его только один раз.

#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;
}

Накопление состояния

Локальные статические переменные позволяют функции помнить текущую сумму без глобальной переменной.

#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;
}

Предупреждение

Статическое состояние заставляет функцию зависеть от истории вызовов, из-за чего её бывает сложнее тестировать. Используйте его осознанно.

#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;
}

Сочетание с циклами

Локальная статическая переменная внутри тела цикла сохраняет значение между итерациями и вызовами.

#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 существуют всю программу
  • Они инициализируются один раз, а по умолчанию получают значение 0
  • Они сохраняют локальную область видимости, но не теряют значения
  • На уровне файла static обеспечивает внутреннее связывание
  • Они особенно удобны для счётчиков и кэшей

Часто задаваемые вопросы

Урок «static-переменные» бесплатный?

Да — полный текст урока «static-переменные» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «static-переменные»?

Сохраняющиеся локальные переменные Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «static-переменные»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. auto и локальная область видимости
  2. static-переменные
  3. extern и глобальные переменные
  4. register и const
← Назад к C Academy