Перечисляемый тип

Перечисляемый тип (сокращённо перечисле́ние, англ. enumeration, enumerated type) — в программировании тип данных, чьё множество значений представляет собой ограниченный список идентификаторов.

Описание и использование

Перечисляемый тип определяется как набор идентификаторов, с точки зрения языка играющих ту же роль, что и обычные именованные константы, но связанные с этим типом. Классическое описание типа-перечисления в языке Паскаль выглядит следующим образом:

type Cardsuit = (clubs, diamonds, hearts, spades);

Здесь производится объявление типа данных Cardsuit (карточная масть), значениями которого может быть любая из четырёх перечисленных констант. Переменная типа Cardsuit может принимать одно из значений clubs, diamonds, hearts, spades, допускается сравнение значений типа перечисление на равенство или неравенство, а также использование их в операторах выбора (в Паскале — case) в качестве значений, идентифицирующих варианты.

Использование перечислений позволяет сделать исходные коды программ более читаемыми, так как позволяют заменить «магические числа», кодирующие определённые значения, на читаемые имена.

На базе перечислений в некоторых языках могут создаваться типы-множества. В таких случаях множество понимается (и описывается) как неупорядоченный набор уникальных значений типа-перечисления.

Перечисляемый тип может использоваться в объявлениях переменных и формальных параметров функций (процедур, методов). Значения перечислимого типа могут присваиваться соответствующим переменным и передаваться через параметры соответствующих типов в функции. Кроме того, всегда поддерживается сравнение значений перечислимого типа на равенство и неравенство. Некоторые языки поддерживают также другие операции сравнения для значений перечислимых типов. Результат сравнения двух перечислимых значений в таких случаях определяется, как правило, порядком следования этих значений в объявлении типов — значение, которое в объявлении типа встречается раньше, считается «меньше» значения, встречающегося позже. Иногда перечислимый тип или некоторый диапазон значений перечислимого типа также может быть использован в качестве типа индекса для массива. В этом случае для каждого значения выбранного диапазона в массиве имеется один элемент, а реальный порядок следования элементов соответствует порядку следования значений в объявлении типа.

Реализация

Обычно в процессе компиляции значения перечислений представляются при помощи целых чисел. В зависимости от конкретного языка программирования такое представление может быть либо полностью скрыто от программиста, либо доступно ему с помощью тех или иных «обходных манёвров» (например, принудительного преобразования значения типа перечисление к значению типа «целое число»), либо даже управляемо программистом (в таких случаях программист имеет возможность явно указать, какими числами будут кодироваться все или некоторые значения типа-перечисления). У всех вариантов есть свои положительные и отрицательные стороны. С одной стороны, возможность использования числовых значений констант, составляющих тип-перечисление, особенно при злоупотреблении ею, лишает смысла использование этих типов и создаёт опасность появления ошибок (когда используются числовые значения, для которых в типе нет соответствующих констант). С другой стороны, явное управление значениями даёт некоторые дополнительные возможности. Например, позволяет использовать типы-перечисления при организации интерфейса с модулями, написанными на других языках, если они используют или возвращают кодированные целыми числами значения из некоторого предопределённого набора.

Ещё одна возможность, которую дают перечислимые типы на уровне реализации языка — экономия памяти. При небольшом объёме типа-перечисления для хранения значения этого типа достаточно нескольких битов (вышеприведённый тип Cardsuit требует всего два бита на значение, в то время как стандартное целое число на большинстве используемых архитектур занимает 32 бита — в 16 раз больше), и компилятор может использовать этот факт для уплотнения хранения данных в памяти. Это может быть особенно важно, если несколько значений типов-перечислений хранятся в одной записи — уплотнение записей при обработке больших их количеств может освободить много памяти. Компиляторы обычно не реализуют эту возможность, по крайней мере, в последнее время, когда компьютерная память существенно подешевела.

Критика

Тип перечисление является традиционным для развитых языков программирования, используется достаточно широко и часто воспринимается как нечто само собой разумеющееся. Тем не менее, этот тип также не обходится без критики со стороны теоретиков и практиков программирования. Так, при разработке языка программирования Оберон перечисляемые типы попали в список возможностей, которые были удалены из языка. Никлаус Вирт, разработчик языка, назвал следующие причины:

  • «во всё возрастающем числе программ непродуманное использование перечислений … приводит к демографическому взрыву среди типов, что, в свою очередь, ведёт не к ясности программ, а к многословию»[1];
  • когда тип перечисление экспортируется модулем (то есть становится частью интерфейса) нарушается общее правило — команда экспорта типа экспортирует одновременно все его элементы, тогда как для всех остальных типов экспорт типа скрывает его внутреннюю структуру;
  • с точки зрения обеспечения удобочитаемости программ ничто не мешает вместо перечислимого типа использовать просто группу совместно определённых именованных констант, особенно при наличии таких языковых механизмов, как модули или классы.

С другой стороны, например, в Java, первоначально не содержащей перечислимого типа, этот тип был впоследствии введён из соображений не только удобства, но и надёжности: проблема использования вместо перечислений групп именованных констант в том, что отсутствует контроль со стороны компилятора как за уникальностью значений констант, так и за возможностью случайного присваивания переменным значений, не соответствующих ни одной из этих констант.

Описание перечислений в различных языках

В языке Ada перечисления задаются с помощью ключевого слова is и последующего списка значений через запятую:

type Cardsuit is (clubs, diamonds, hearts, spades);

C и языки с C-подобным синтаксисом

Первоначальный K&R-диалект C не имел перечисляемых типов, однако они были добавлены в стандарте ANSI C.

 enum cardsuit 
 {
    CLUBS,
    DIAMONDS,
    HEARTS,
    SPADES
 };

Динамические языки слабой типизации с C-подобным синтаксисом (например perl или JavaScript), как правило, не имеют перечислений.

Перечисления в языке C++ прямо наследуют поведение перечислений языка C, за исключением того, что перечисляемый тип в C++ — настоящий тип, и ключевое слово enum используется только при объявлении такого типа. Если при обработке параметра, являющегося перечислением, какое-либо значение из перечисления не обрабатывается (например один из элементов перечисления забыли обработать в конструкции switch), то компилятор может выдать предупреждение о забытом значении.[2]

C++ 11 предоставляет второй, типобезопасный тип перечисления, который не преобразуется неявно в целочисленный тип. Это определяется фразой «enum class». Например:

enum class Color {Red, Green, Blue};

Базовый тип является реализация определённых интегрального типа, который достаточно велик, чтобы вместить все перечисленные значения (он не должен быть наименьшим возможным типом!). В C++ вы можете указать базовый тип напрямую. Это допускает «предварительные объявления» перечислений:

enum class Color : long {Red, Green, Blue};  // должен соответствовать по размеру и разметке памяти типа «long»
enum class Shapes : char;  // предварительная декларация. Если позже будут определены значения, которые не помещаются в 'char', это ошибка.
enum Cardsuit { Clubs, Diamonds, Spades, Hearts }

В первоначальной Java перечислений не было, вместо них предлагалось использовать классы со статическими константами. Начиная с версии 5 (1.5) перечисления были введены в язык, они представляют собой полноценный класс, в который можно добавлять произвольное количество полей и методов. Перечисления были введены для улучшенного контроля за типобезопасностью.[3]

enum Cardsuit { Clubs, Diamonds, Spades, Hearts }
enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

В некоторых языках программирования (например, в языке Haskell) при помощи Алгебраических типов можно эмулировать перечисления. Например, так кодируется булевский тип, содержащий два идентификатора для представления значений истинности:


  data Bool = False
	    | True

type
  enumType = enum
    one, two, three
    
var a: enumType = three
var b = two
echo a > b
//Обычный enum
enum Colors {
    GREEN = 1,
    BLUE,
    RED
}
//Flags enum
[Flags]
enum Borders {
    LEFT,
    RIGHT,
    TOP,
    BOTTOM
}

void draw_borders (Borders selected_borders) {
    // equivalent to: if ((Borders.LEFT & selected_borders) > 0)
    if (Borders.LEFT in selected_borders) {
        
    }
}
pragma solidity ^0.4.4;

contract SimpleEnum {

  enum SomeData {DEFAULT,ONE,TWO}
  SomeData someData;

  function SimpleEnum(){
      someData = SomeData.DEFAULT;
  }

  function setValues(uint _value){
      require(uint(SomeData.TWO) >= _value);
      someData = SomeData(_value);
  }

  function getValue() constant returns (uint){
      return uint(someData);
  }
}

Примечания

  1. Н. Вирт. От Модулы к Оберону. Дата обращения: 17 апреля 2008. Архивировано 19 сентября 2011 года.
  2. Перечисления в C++ (c++ enum types). Дата обращения: 20 апреля 2009. Архивировано 16 апреля 2009 года.
  3. Enums. Дата обращения: 13 февраля 2008. Архивировано 27 февраля 2008 года.

Read other articles:

Television specials by MTV For the youth award, see MTV Youth Icon of the Year. The MTV Icon series logo MTV Icon (stylized as mtv:ICON) is a series of annual television specials produced by MTV between 2001 and 2004, each paying homage to a musical artist or band selected as a cultural icon, in a format similar to the network's annual Video Music Awards and Movie Awards events. A live audience of musicians, celebrities, and fans would view a biographical film depicting the career of that yea...

 

This article is about the Canadian superhero. For the American superhero, see Iron Man. For other uses, see Iron Man (disambiguation). Comics character Iron ManPublication informationPublisherMaple Leaf PublishingFirst appearanceBetter Comics #1 (March 1941)Created byVernon MillerIn-story informationAlter ego AbilitiesSuper strength, indestructibility, amphibiousness Iron Man is a Canadian fictional character, created by cartoonist Vernon Miller for Maple Leaf Publishing. A superhero, the cha...

 

العلاقات الإماراتية البوتسوانية الإمارات العربية المتحدة بوتسوانا   الإمارات العربية المتحدة   بوتسوانا تعديل مصدري - تعديل   العلاقات الإماراتية البوتسوانية هي العلاقات الثنائية التي تجمع بين الإمارات العربية المتحدة وبوتسوانا.[1][2][3][4][5...

Roller derby league Magnolia Roller VixensMetro areaJackson, MSCountryUnited StatesFounded2008Dissolved2016TeamsAll StarsTrack type(s)FlatVenueJackson Convention CenterAffiliationsWFTDAWebsitewww.magnoliarollervixens.com[dead link] League members in 2010 Magnolia Roller Vixens (MRV) was a women's flat track roller derby league based in Jackson, Mississippi. Founded in 2008, the league consisted of a single team, which competed against teams from other leagues. Magnolia was a member of...

 

Padre PadronePoster bioskopSutradaraPaolo TavianiVittorio TavianiProduserGiuliani G. De NegriSkenarioPaolo TavianiVittorio TavianiCeritaGavino LeddaPemeranOmero AntonuttiPenata musikEgisto MacchiSinematograferMario MasiniPenyuntingRoberto PerpignaniDistributorRadiotelevisione ItalianaCinema 5 Distributing (AS)Artificial Eye (Britania)Tanggal rilis Juni 1977 (1977-06) (Berlinale) 23 Desember 1977(New York Film Festival)Durasi114 menitNegaraItaliaBahasaItaliaSardegnaLatin Padre P...

 

Japanese manga series Princess JellyfishCover of volume 1 of Princess Jellyfish, published by Kodansha海月姫(Kuragehime)GenreComing-of-age[1]Romantic comedy[1]Slice of life[2] MangaWritten byAkiko HigashimuraPublished byKodanshaEnglish publisherNA: Kodansha USAMagazineKissDemographicJoseiOriginal runOctober 25, 2008 – August 25, 2017Volumes17 (List of volumes) Anime television seriesDirected byTakahiro OmoriProduced byKazuaki MorijiriMitsuhiro ...

Questa voce sugli argomenti stadi e sport in Slovenia è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Arena Stožice Informazioni generaliStato Slovenia UbicazioneLubiana Inizio lavori10 agosto 2010 Inaugurazione2010 ProprietarioComune di Lubiana Informazioni tecnichePosti a sedere12480 StrutturaArena CoperturaSì Mat. del terrenoParquet Uso e beneficiariPallacanestro Union Olimpija Slovenia ...

 

2012 film by Shinji Aramaki This article's lead section may be too short to adequately summarize the key points. Please consider expanding the lead to provide an accessible overview of all important aspects of the article. (August 2013) Starship Troopers: InvasionOfficial DVD coverDirected byShinji Aramaki[1]Screenplay byFlint Dille[1]Story by Shigehito Kawada Shinji Aramaki Joseph Chou Based onStarship Troopersby Robert A. HeinleinProduced byJoseph Chou[1]Music byTets...

 

American columnist (1922–2009) Army ArcherdArcherd at the 1988 Academy AwardsBornArmand Andre Archerd(1922-01-13)January 13, 1922Bronx, New York City, U.S.DiedSeptember 8, 2009(2009-09-08) (aged 87)Los Angeles, California, U.S.Alma materUniversity of California, Los AngelesSpouses Joan Paul ​ ​(m. 1944; div. 1969)​ Selma (Fenning) Archerd ​ ​(m. 1969)​ Children2 Armand Andre Archerd (January 13, 192...

Cet article est une ébauche concernant une localité suisse. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Schlieren Armoiries Administration Pays Suisse Canton Zurich District Dietikon Maire Markus Bärtschiger (PS) NPA 8952 No OFS 0247 Démographie Populationpermanente 20 350 hab. (31 décembre 2022) Densité 3 083 hab./km2 Langue Allemand Géographie Coordonnées 47° 23′...

 

Северный морской котик Самец Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:Синапси...

 

Ця стаття потребує додаткових посилань на джерела для поліпшення її перевірності. Будь ласка, допоможіть удосконалити цю статтю, додавши посилання на надійні (авторитетні) джерела. Зверніться на сторінку обговорення за поясненнями та допоможіть виправити недоліки. Мат...

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada November 2022. Untuk pemeran Prancis, lihat Francis Perrin (pemeran). Francis Perrin (17 Agustus 1901 – 4 Juli 1992) adalah seorang fisikawan asal Prancis,[1] putra dari pemenang Nobel Fisika Jean Perrin. Fisikawan Francis Perrin lahir di Par...

 

Overview of the foreign relations of Australia RG Casey House, Canberra, is the headquarters of the Department of Foreign Affairs and Trade. Foreign relations of Australia are influenced by its position as a leading trading nation and as a significant donor of humanitarian aid. Australia's foreign policy is guided by a commitment to multilateralism and regionalism, as well as to build strong bilateral relations with its allies. Key concerns include free trade, terrorism, refugees, economic co...

 

Historic public square in Istanbul, Turkey Not to be confused with the Covered Hippodrome, a nearby structure belonging to the Great Palace. Parts of this article (those related to the modern square) need to be updated. Please help update this article to reflect recent events or newly available information. (March 2021) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and re...

Former US Air Force radar station in Canada Cut Throat Island Air Station Part of Pinetree LineLabrador, Canada Emblem of the 922d Aircraft Control and Warning SquadronCoordinates54°29′47″N 057°08′00″W / 54.49639°N 57.13333°W / 54.49639; -57.13333 (Cut Throat Island N-27A)TypeRadar StationSite informationControlled byAerospace Defense CommandSite historyBuilt1957Built byUnited States Air ForceIn use1957-1961 Cut Throat Island ASclass=...

 

Untuk kegunaan lain, lihat Pinball (disambiguasi). Mesin pinball Terminator 2: Judgment Day Pinball adalah sebuah jenis permainan arkade, dimana poin dicetak oleh pemain dengan menggerakkan satu bola metalik atau lebih pada tempat bermain di dalam kabin yang ditutupi kaca bernama mesin pinball. Tujuan utama dari permainan tersebut adalah mencetak poin sebanyak mungkin. Pranala luar Wikimedia Commons memiliki media mengenai Pinball games. Internet Pinball Database World's largest online search...

 

A sailing maneuver Tacking: Sailing the craft into the wind from the port tack to the starboard tack. Beating to windward on a series of port and starboard tacks, tacking between each at points 1, 2, and 3. Tacking or coming about is a sailing maneuver by which a sailing craft (sailing vessel, ice boat, or land yacht), whose next destination is into the wind, turns its bow toward and through the wind so that the direction from which the wind blows changes from one side of the boat to the othe...

2018 California lieutenant gubernatorial election ← 2014 November 6, 2018 2022 →   Candidate Eleni Kounalakis Ed Hernandez Party Democratic Democratic Popular vote 5,914,068 4,543,863 Percentage 56.55% 43.45% County resultsKounalakis:      50–60%      60–70% Hernandez:      50–60%      60–70% Lieutenant Governor before election Gavin Newsom Democratic El...

 

Artículo principal: Liga de Campeones de la UEFA 2021-22 Final de la Liga de Campeones de la UEFA 2021-22 El Stade de France sede del partido.LocalizaciónPaís  FranciaLugar Stade de France, Saint-DenisDatos generalesTipo Final de la Liga de Campeones de la UEFASuceso Final de Liga de Campeones 2021-22Participantes Liverpool Real MadridHistóricoFecha 28 de mayo de 2022Cronología Final de la Liga de Campeones de la UEFA 2020-21 ◄ Actual ► Final de la Liga de Campeones de la U...