Константы и литералы в C: целочисленные, вещественные, символьные, строковые и определение констант
Что такое константы и литералы?
Литерал — это запись фиксированного значения в коде (42, 3.14, 'A', "Hello"). Константа — именованное значение, которое не меняется во время выполнения. В C константы создаются через #define или const.
Целочисленные литералы
Могут быть в 3 системах счисления:
| Основание | Префикс | Пример | Значение |
|---|---|---|---|
| Десятеричное | нет | 212 | 212 |
| Восьмеричное | 0 | 032 | 26 |
| Шестнадцатеричное | 0x или 0X | 0xFF | 255 |
Суффиксы типа
Указывают точный тип литерала (регистронезависимы, порядок любой):
U/u—unsigned(42u)L/l—long(42L)LL/ll—long long(C99) (42LL)- Комбинации:
UL,ULL,LU,LLU...
Без суффикса компилятор выбирает первый подходящий тип из: int, long, long long, unsigned int, unsigned long, unsigned long long.
Примеры
85 // int (decimal)
0213 // int (octal)
0x4b // int (hex)
30u // unsigned int
30l // long
30ul // unsigned long
0xFeeL // long (hex)
215u // unsigned int
078 // ОШИБКА: 8 не октальная цифра
032UU // ОШИБКА: повтор суффикса
Вещественные литералы
Синтаксис: цифры . цифры [e|E [+|-] цифры] [суффикс]
- Десятичная форма:
3.14159,.5(0.5),5.(5.0) - Экспоненциальная:
3.14e-5,1E6,.5e+2
Суффиксы
- Нет суффикса →
double(по умолчанию) f/F→float(3.14f)l/L→long double(3.14L)
Примеры
3.14159 // double
314159E-5L // long double
510E // ОШИБКА: неполный экспонент
210f // ОШИБКА: нет точки или экспоненты (это int)
.e55 // ОШИБКА: нет целой или дробной части
Символьные константы
Заключены в одинарные кавычки: 'A', '9', '\n'. Тип — int (в C! в C++ — char). Размер — sizeof(int).
Escape-последовательности
| Последовательность | Значение | Код (hex) |
|---|---|---|
\a | Звонок (BEL) | 0x07 |
\b | Backspace | 0x08 |
\f | Form feed (новая страница) | 0x0C |
\n | Новая строка (LF) | 0x0A |
\r | Возврат каретки (CR) | 0x0D |
\t | Горизонтальная табуляция | 0x09 |
\v | Вертикальная табуляция | 0x0B |
\\ | Обратный слеш \ | 0x5C |
\' | Одинарная кавычка ' | 0x27 |
\" | Двойная кавычка " | 0x22 |
\? | Вопросительный знак ? | 0x3F |
\ooo | Восьмеричный код (1-3 цифры) | напр. \101 = 'A' |
\xhh... | Шестнадцатеричный код (1+ цифр) | напр. \x41 = 'A' |
\uhhhh | Unicode (16 бит, C11) | U+HHHH |
\Uhhhhhhhh | Unicode (32 бит, C11) | U+HHHHHHHH |
Пример
printf("Строка 1\nСтрока 2\tТаб\nЗвонок\a");
Строковые литералы
Заключены в двойные кавычки: "Hello". Тип — char[] (массив), заканчивается неявным \0 (null-terminator).
"Hello"→ массив из 6 байт:'H','e','l','l','o','\0'- Склеивание:
"Hello, " "World"→"Hello, World"(на этапе препроцессинга). - Многострочные: используйте конкатенацию или
\в конце строки (но лучше конкатенация).
const char *msg = "Это длинная строка, "
"которая разбита на несколько строк "
"для читаемости кода.";
Определение именованных констант
1. Препроцессор: #define
#define PI 3.14159265358979323846
#define MAX_SIZE 1024
#define GREETING "Hello, World!"
#define FLAG (1 << 3) // выражения допустимы
Особенности:
- Простая текстовая подстановка препроцессором (до компиляции).
- Нет проверки типов, нет области видимости (глобальны от точки определения).
- Не занимают память (код подставляется везде).
- Нельзя отладить в отладчике (нет символа).
- Соглашение: имена в UPPER_SNAKE_CASE.
2. Ключевое слово const
const double PI = 3.14159265358979323846;
const int MAX_SIZE = 1024;
const char *GREETING = "Hello, World!";
Преимущества:
- Имеют тип, проверяются компилятором.
- Имеют область видимости (блок, файл).
- Могут быть в отладчике.
- Могут использоваться в контекстах, требующих адрес (
&PI). - Могут быть
static(внутренняя линковка) илиextern.
3. enum для целочисленных констант
enum Color { RED, GREEN, BLUE }; // RED=0, GREEN=1, BLUE=2
enum ErrorCode { OK = 0, ERR_IO = 1, ERR_MEM = 2 };
Преимущества: типобезопасность (в отладчике видно имя), группировка, автоматическая нумерация.
Сравнение подходов
| Характеристика | #define | const | enum |
|---|---|---|---|
| Тип | Нет (текст) | Да | int (enum type) |
| Область видимости | Файл (до конца) | Блок/файл | Блок/файл |
| Память | Нет | Да (обычно оптимизируется) | Нет (константы) |
| Адрес (&) | Нет | Да | Нет |
| Отладка | Нет | Да | Да (имена) |
| Выражения | Да | Только константные | Константные |
Рекомендации
- Для простых констант:
const(илиenumдля групп). - Для условной компиляции / конфигурации:
#define. - Для строк:
const char *илиconst char[]. - Избегайте магических чисел — давайте имена константам.
Язык C
- Комплексный обзор резисторов, катушек и конденсаторов в цепях переменного тока
- Понимание ключевых слов и идентификаторов C#: правила, списки и лучшие практики
- Классы и объекты в C#: Фундаменты надёжного ООП
- Абстрактные классы и методы в C#: практическое руководство
- Частичные классы и методы в C#: понимание и применение
- Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
- Освоение переменных, литералов и констант в C++: подробное руководство
- Ключевые слова и идентификаторы в C: практическое руководство
- Переменные, константы и литералы в C: полное руководство
- Переменные, типы данных и константы в C — практическое руководство