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 — локальная установка не требуется.