Перечисления в C: определение, объявление и операции с флагами
Перечисления в C
Изучите, как определять, объявлять и использовать перечисления в C — с практическими примерами, техниками флагов и информацией о размере.
В C перечисление (enum) — это тип, группирующий набор именованных целочисленных констант, обеспечивающий более четкое выражение намерений и типобезопасность на этапе компиляции.
enum flag {const1, const2, ..., constN};
По умолчанию const1 равно 0, const2 — 1, и так далее. При необходимости можно задать собственные значения при объявлении.
// Настройка констант enum
enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3,
};
Объявление перечисляемого типа
Определение enum создает новый тип, который можно использовать для переменных. Вот как объявить и инстанцировать его.
enum boolean {false, true};
enum boolean check; // объявление переменной
Переменная check теперь имеет тип enum boolean. Ее значения соответствуют false = 0 и true = 1.
enum boolean {false, true} check;
Пример: Перечисление дней недели
#include <stdio.h>
enum week {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
int main() {
enum week today = Wednesday;
printf("Day %d", today + 1);
return 0;
}
Вывод
Day 4
Зачем использовать перечисления?
Переменные enum хранят одно именованное значение, делая код самодокументируемым. Они также занимают столько же памяти, сколько int по умолчанию, обычно 4 байта на большинстве платформ.
#include <stdio.h>
enum suit {club = 0, diamonds = 10, hearts = 20, spades = 3} card;
int main() {
card = club;
printf("Size of enum variable = %d bytes", sizeof(card));
return 0;
}
Вывод
Size of enum variable = 4 bytes
Этот размер соответствует базовому типу int, хотя точный размер может варьироваться в зависимости от компилятора и архитектуры.
Использование перечислений для флагов
Перечисления отлично подходят для представления флагов, когда каждая константа — отдельная степень двойки. Это позволяет комбинировать флаги с побитовым ИЛИ и проверять их с побитовым И.
#include <stdio.h>
enum designFlags {ITALICS = 1, BOLD = 2, UNDERLINE = 4} button;
Так как значения — степени двойки:
// Бинарное представление ITALICS = 00000001 BOLD = 00000010 UNDERLINE = 00000100
Их можно комбинировать:
#include <stdio.h>
enum designFlags {BOLD = 1, ITALICS = 2, UNDERLINE = 4};
int main() {
int myDesign = BOLD | UNDERLINE; // 00000001 | 00000100 = 00000101
printf("%d", myDesign);
return 0;
}
Вывод
5
Вывод 5 указывает, что активны и BOLD, и UNDERLINE.
Для проверки конкретного флага:
if (myDesign & ITALICS) {
// обработать курсив
}
Хотя многие результаты можно достичь без перечислений, они предоставляют надежный, типобезопасный способ управления связанными константами — особенно для операций с флагами.
Язык C
- C# Hello World — создание вашего первого C# приложения
- Понимание ключевых слов и идентификаторов C#: правила, списки и лучшие практики
- Мастерство C# переменных и примитивных типов данных: полное руководство
- Операторы C# — исчерпывающее руководство по операторам в C#
- Освоение побитовых и сдвиговых операторов в C#: полное руководство
- Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
- Выражения, операторы и блоки в C#: подробное руководство с примерами
- Освоение комментариев в C#: виды, лучшие практики и XML-документация
- Освоение оператора switch в C#: синтаксис, примеры и лучшие практики
- Тернарный оператор в C#: краткое руководство по условным выражениям