Съкратено за изброяване, enum променлив тип може да се намери в C (ANSI, не в оригиналния K&R), C ++ и ° С#. Идеята е, че вместо да използвате инт за представяне на набор от стойности, вместо това се използва тип с ограничен набор от стойности.
Например, ако използваме цветовете на дъгата, които са
- червен
- оранжев
- жълт
- зелен
- Син
- индиго
- виолетов
Ако не съществуват суми, може да използвате a #define (в С) или конст в C ++ / C #, за да посочите тези стойности. Напр
Прекалено много инти за броене!
Проблемът с това е, че има много повече целочислени отколкото цветове. Ако виолетовият има стойността 7 и програма присвоява стойност на 15 на променлива, тогава тя очевидно е грешка, но може да не бъде открита, тъй като 15 е валидна стойност за един int.
Енум към Спасението
Enum е определен от потребителя тип, състоящ се от набор от именани константи, наречени изброители. Цветовете на дъгата ще бъдат картографирани така:
Сега вътрешно, компилаторът ще използва int, за да ги задържи и ако не се предоставят стойности, червеното ще бъде 0, оранжевото е 1 и т.н.
Въпросът е в това rainbowcolors е тип и само други променливи от същия тип могат да бъдат присвоени на това. C преминава по-лесно (т.е. по-малко строго набран), но C ++ и C # няма да позволят назначаване, освен ако не го форсирате с помощта на гласове.
Не сте останали с тях съставител генерирани стойности, можете да им зададете собствена цялостна константа, както е показано тук.
Наличието на синьо и индиго със същата стойност не е грешка, тъй като изброителите могат да включват синоними като червено и пурпурно.
Езикови разлики
В C, the променлив декларацията трябва да се предхожда от думата ENUM както в
В C ++ обаче не е необходимо като rainbowcolors е отделен тип, който не се нуждае от префикс тип enum.
В C # стойностите се получават от името на типа, както в
Каква е точката на енумите?
Използването на enums увеличава нивото на абстракция и позволява на програмиста да мисли какво означават стойностите, а не да се тревожи за това как се съхраняват и достъпът им. Това намалява появата на бъгове.
Ето един пример. Имаме комплект светофари с три крушки- червен, жълт и зелен. Във Великобритания последователността на светофарите се променя в тези четири фази.
- червен - Трафикът е спрян.
- И двете червен и жълт - Трафикът все още е спрян, но светлините на път да се променят в зелени.
- зелен - Трафикът може да се движи.
- жълт - Предупреждение за предстояща промяна в червено.
Пример за светофари
Светлините се управляват, като се запишат на долните три бита на контролен байт. Те са изложени като битов модел по-долу в двоичен код, където RYG представляват трите бита. Ако R е 1, червената светлина свети и т.н.
В този случай е лесно да се види, че четирите състояния по-горе съответстват на стойности 4 = червен на, 6 = червен + жълт и двете, 1 = зелен на и 2 = жълт На.
С тази функция
Използване на клас вместо Enums
В C ++ и C # ще трябва да създадем клас и след това свръхтовар операторът | позволявам OR-позиция от видове светофар.
Използвайки enums, ние предотвратяваме проблемите с други битове да бъдат присвоени на байта за контрол на крушката. Възможно е някои от другите битове да контролират самопроверка или превключвател „Зелена лента“. В този случай грешка, която позволява да се зададат тези битове при нормална употреба, може да доведе до хаос.
За да сме сигурни, бихме маскирали битовете в SetTrafficlights ()функция така че без значение каква стойност се предава, се променят само долните три бита.
заключение
Енумите имат тези предимства:
- Те ограничават стойностите, които променливата enum може да приеме.
- Принуждават ви да помислите за всички възможни стойности, които може да приеме енумът.
- Те са константа, а не число, което увеличава четимостта на програмен код