Переменные const
Делайте значения доступными только для чтения.
«Переменные const» — бесплатный урок C Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Что означает const
Ключевое слово const сообщает компилятору, что значение переменной нельзя изменять после инициализации.
Если попытаться изменить его позже, компиляция завершится ошибкой. Это защищает значения, которые должны оставаться неизменными.
const int MAX_USERS = 100;Объявление константы
Значение переменной const нужно указать при объявлении, поскольку присвоить его позже нельзя.
Здесь PI инициализируется один раз и используется для чтения как обычная переменная.
#include <stdio.h>
int main(void) {
const double PI = 3.14159;
printf("%f\n", PI);
return 0;
}Попытка изменить константу
Присваивание переменной const после объявления является ошибкой компиляции.
Компилятор отклонит приведённую ниже строку, именно этого мы и хотим добиться с помощью защиты.
const int LIMIT = 50;
/* LIMIT = 60; <- compile error */У константы есть тип
В отличие от обычного макроса, переменная const имеет настоящий тип, который проверяет компилятор.
Это обеспечивает безопасность типов: компилятор знает, что RATE имеет тип double, и предупреждает о неправильном использовании.
#include <stdio.h>
int main(void) {
const double RATE = 0.05;
double total = 200.0 * RATE;
printf("%.2f\n", total);
return 0;
}Константа и указатели: данные
Неизменяемость указателей бывает двух видов. const int *p означает, что данные, на которые указывает p, нельзя изменить через p.
При этом можно изменить адрес, на который указывает p, но нельзя записывать данные через него.
int x = 5;
const int *p = &x;
/* *p = 9; <- error: data is const */Константа и указатели: указатель
int *const p означает, что сам указатель нельзя переназначить, но данные можно изменять.
Объявления читайте справа налево: «p — константный указатель на int».
int x = 5, y = 8;
int *const p = &x;
*p = 9; /* allowed */
/* p = &y; <- error: pointer is const */Защита аргументов функции
Пометка параметра-указателя как const гарантирует, что функция не будет изменять данные вызывающего кода.
Это документирует намерение и позволяет компилятору обнаружить случайные записи.
#include <stdio.h>
void show(const char *msg) {
printf("%s\n", msg);
}
int main(void) {
show("hello");
return 0;
}const в вычислениях
Обычно это используют для фиксированных конфигурационных значений, например ставки налога или коэффициента преобразования.
Чтение константы делает формулу понятнее и хранит значение в одном месте.
#include <stdio.h>
int main(void) {
const double KM_PER_MILE = 1.609;
double miles = 10.0;
printf("%.2f km\n", miles * KM_PER_MILE);
return 0;
}У const есть адрес в памяти
Поскольку const — это полноценная переменная, она занимает место в памяти, и Вы можете получить её адрес.
Это отличается от макроса #define, который выполняет простую текстовую подстановку и не имеет адреса.
#include <stdio.h>
int main(void) {
const int N = 42;
const int *p = &N;
printf("%d\n", *p);
return 0;
}Область видимости и время жизни
Для const действуют те же правила области видимости, что и для обычных переменных.
Объявленная внутри функции переменная является локальной, а объявленная за её пределами — глобальной. Такая область видимости — ещё одно преимущество перед макросами, действующими на уровне всего файла.
#include <stdio.h>
const int GLOBAL_MAX = 1000;
int main(void) {
const int local_min = 1;
printf("%d %d\n", local_min, GLOBAL_MAX);
return 0;
}const и магические числа
Замена чисел, записанных непосредственно в коде, именованными значениями const устраняет «магические числа».
Если значение когда-нибудь изменится, Вы отредактируете одну строку, а не будете искать его по всей программе.
#include <stdio.h>
int main(void) {
const int SECONDS_PER_MIN = 60;
int minutes = 5;
printf("%d seconds\n", minutes * SECONDS_PER_MIN);
return 0;
}Быстрая проверка
Проверьте, насколько хорошо Вы понимаете поведение const.
Итоги
Переменная const — это типизированное значение только для чтения, которое компилятор защищает от изменений.
В отличие от макроса, у неё есть тип, область видимости и адрес. При работе с указателями const может относиться к данным, к указателю или к обоим. Далее мы сравним это с #define.
Часто задаваемые вопросы
Урок «Переменные const» бесплатный?
Да — полный текст урока «Переменные const» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Переменные const»?
Делайте значения доступными только для чтения. Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Переменные const»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.