A számítógépes programozásban egy felsorolt típus (más néven enumeration, enum, vagy factor az R programozási nyelvben, feltétel-név a COBOL programozási nyelvben, status variable a JOVIAL programozási nyelvben, ordinal a PL/I programozási nyelvben és kategorikus változó a statisztikában) egy adattípus, amely elnevezett értékek halmazából áll, amelyeket a típus elemeinek (elements), tagjainak (members), felsorolásainak (enumeral) vagy felsorolóinak enumerators) neveznek. A felsorolt nevek általában azonosítók, amelyek konstansként viselkednek a nyelvben. Egy felsorolt típus tekinthető az egységtípusok degenerált, címkézett uniójának.A címkézett unió (tagged union), más néven variánsrekord, választási típus, diszjunkt unió vagy összegtípus egy olyan adatstruktúra, amely egy olyan érték tárolására szolgál, amely több különböző, de rögzített típust vehet fel. Egy felsorolt típusként deklarált változóhoz bármelyik felsoroló értéke rendelhető. Más szóval, egy felsorolt típusnak olyan értékei vannak, amelyek egymástól különböznek, és amelyek összehasonlíthatók és hozzárendelhetők, de a programozó általában nem határozza meg, hogy a számítógép memóriájában bármilyen konkrét reprezentációval rendelkezzenek; a fordítóprogramok és interpreterek tetszőlegesen ábrázolhatják ezeket.

Leírás Például egy pakli kártya négy színe lehet négy felsoroló, úgynevezett Treff, Káró, Kőr és Pikk, amelyek egy felsorolt típushoz, a színhez tartoznak. Ha egy V változót szín adattípussal deklarálunk, akkor a négy érték bármelyikét hozzárendelhetjük.

Bár a felsorolók általában különbözőek, egyes nyelvek lehetővé teszik, hogy ugyanazon felsoroló kétszer szerepeljen a típusdeklarációban. A felsorolók nevének nem kell szemantikailag teljesnek vagy bármilyen értelemben kompatibilisnek lennie. Például egy color nevű felsorolt típus definiálható úgy, hogy a Red, Green, Zebra, Missing és Bacon felsorolókból álljon. Egyes nyelvekben a felsorolt típus deklarációja szándékosan meghatározza a tagjainak sorrendjét is (Magas, Közepes és Alacsony prioritás); másokban a felsorolók rendezetlenek (angol, francia, német és spanyol támogatott nyelvek); megint másokban pedig implicit sorrend adódik abból, hogy a fordító konkrétan egész számként reprezentálja a felsorolókat.

Néhány felsoroló típus beépíthető a nyelvbe. A Boole-típus például gyakran a False és True értékek előre definiált felsorolása. Egyetlen értékből álló egységtípus is definiálható a null érték ábrázolására. Számos nyelv lehetővé teszi a felhasználók számára új felsorolt típusok definiálását.

A felsorolt típusú értékeket és változókat általában valamilyen egész típusú reprezentációval valósítják meg. Egyes programozási nyelvek, különösen a rendszerprogramozási nyelvek, lehetővé teszik a felhasználó számára, hogy meghatározza az egyes felsorolókhoz használandó bitkombinációt, ami hasznos lehet a felsorolóhalmazok fix hosszúságú bitláncokként való hatékony ábrázolásához. A típuselméletben a felsorolt típusokat gyakran egységtípusok címkézett unióinak tekintik. Mivel az ilyen típusok alakúak, természetes számokként is felírhatók.

Indoklás Néhány korai programozási nyelv eredetileg nem rendelkezett felsorolt típusokkal. Ha egy programozó azt szerette volna, ha egy változó, például a myColor, a red értéket kapja, akkor a red változót deklarálták, és tetszőleges értéket rendeltek hozzá, általában egy egész konstanst. A red változóhoz ezután a myColor értéket rendelték hozzá. Más technikák tetszőleges értékeket rendeltek a felsorolók nevét tartalmazó karakterláncokhoz.

Ezeket a tetszőleges értékeket néha mágikus számoknak (magic number) nevezték, mivel gyakran nem volt magyarázat arra, hogyan nyerték ki a számokat, vagy hogy a tényleges értékeik jelentősek-e. A mágikus szám egy adott fogalmat azonosít, de további ismeretek nélkül a jelentése nem egyértelmű, ezért a használata megnehezítheti a forráskód megértését és karbantartását mások számára.

A felsorolt típusok ezzel szemben öndokumentálóbbá teszik a kódot. A nyelvtől függően a fordító automatikusan alapértelmezett értékeket rendelhet a felsorolókhoz, ezáltal elrejtve a felesleges részleteket a programozó elől. Ezek az értékek esetleg nem is láthatók a programozó számára (lásd: információ elrejtése). A felsorolt típusok megakadályozhatják, hogy a programozó logikátlan kódot írjon, például matematikai műveleteket hajtson végre a felsorolók értékeivel. Ha egy felsorolóhoz rendelt változó értékét ki kellene nyomtatni, egyes programozási nyelvek a felsoroló nevét is kinyomtathatnák a mögöttes numerikus érték helyett. További előny, hogy a felsorolt típusok lehetővé teszik a fordítók számára a szemantikai helyesség érvényesítését. Például: a myColor = TRIANGLE tiltható, míg a myColor = RED elfogadott, még akkor is, ha a TRIANGLE és a RED is belsőleg 1-es értékkel van reprezentálva.

Fogalmilag egy felsorolt típus hasonló a névleges értékekA névleges számok olyan számok, amelyeket címkékként használnak az elemek egyedi azonosítására. A számok tényleges értékei, amelyeket ezek a számok képviselnek, kevésbé relevánsak, mivel nem jelzik a mértéket, a rangot vagy bármilyen más mértékegységet. (numerikus kódok) listájához, mivel a típus minden lehetséges értékéhez egy egyedi természetes szám tartozik. Egy adott felsorolt típus tehát ennek az elképzelésnek a konkrét megvalósítása. Amikor a sorrend értelmes és/vagy összehasonlításra szolgál, akkor egy felsorolt típus ordinális típussá válik.

Megállapodások A programozási nyelveknek általában saját, gyakran több programozási stílusuk és elnevezési konvenciójuk van. A felsoroláshoz rendelt változó általában egyes számú főnév, és gyakran PascalCase vagy nagybetűs konvenciót követ, míg a kisbetűk és más konvenciók ritkábban fordulnak elő.

Szintaxis több programozási nyelven

ALGOL 60 alapú nyelvek Míg az ALGOL 60-nak magának nincs felsorolási típusa, számos belőle származó nyelvnek van. Különösen a Pascal volt erős hatással az Ada tervezésére.

Pascal Pascalban egy felsorolt típus implicit módon deklarálható az értékek zárójeles listában való felsorolásával:

var suit: (clubs, diamonds, hearts, spades);

A deklaráció gyakran egy típusszinonima-deklarációban jelenik meg, így több változóhoz is használható:

type cardsuit = (clubs, diamonds, hearts, spades); card = record suit: cardsuit; value: 1 .. 13; end; var hand: array [ 1 .. 13 ] of card; trump: cardsuit; A felsorolási értékek megadásának sorrendje számít. Egy felsorolt típus egy ordinális típus, és a pred és succ függvények a felsorolás előző vagy következő értékét adják meg, az ord pedig a felsorolási értékeket egész számokká alakíthatja. A standard Pascal azonban nem kínál konverziót aritmetikai típusokról felsorolásokra. A kiterjesztett Pascal ezt a funkciót egy kiterjesztett succ függvényen keresztül kínálja. Néhány más Pascal dialektus típusátalakításokon keresztül teszi lehetővé. A Pascal néhány modern leszármazottja, mint például a Modula-3, egy speciális konverziós szintaxist biztosít egy VAL nevű metódus használatával; a Modula-3 a BOOLEAN és CHAR típusokat is speciális előre definiált felsorolt típusokként kezeli, és az ORD és VAL típusokat használja a szabványos ASCII dekódoláshoz és kódoláshoz.

A Pascal stílusú nyelvek lehetővé teszik a felsorolás tömbindexként való használatát is:

var suitcount: array [cardsuit] of integer;

Ada Az Adában a felsorolt típusok definíciója hasonló a Pascalhoz, az "=" karaktereket "is"-re cserélve:

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

A Pred, Succ, Val és Pos mellett az Ada támogatja az egyszerű karakterlánc-konverziókat Image and Value segítségével is.

A C stílusú nyelvekhez hasonlóan az Ada lehetővé teszi a felsorolás belső reprezentációjának megadását:

for Cardsuit use (clubs => 1, diamonds => 2, hearts => 4, spades => 8);

Az Ada lehetővé teszi a felsorolás bitjeinek számának egyértelmű megadását is, ellentétben a C stílusú nyelvekkel, amelyek inkonzisztens támogatással rendelkeznek, ami gyakran finom fordítási hibákhoz vezet. Például:

for Cardsuit'Size use 4; -- 4 bits

Ezenkívül a felsorolások használhatók tömbök indexeként, mint például a Pascalban, de a felsorolásokhoz attribútumok vannak definiálva.

Shuffle : constant array(Cardsuit) of Cardsuit := (Clubs => Cardsuit'Succ(Clubs), -- see attributes of enumerations 'First, 'Last, 'Succ, 'Pred Diamonds => Hearts, --an explicit value Hearts => Cardsuit'Last, --first enumeration value of type Cardsuit e.g., clubs Spades => Cardsuit'First --last enumeration value of type Cardsuit e.g., spades );

A Modula-3-hoz hasonlóan az Ada a Boolean és a Character típusokat speciális, előre definiált (a "Standard" csomagban) felsorolt típusokként kezeli. A Modula-3-mal ellentétben saját karaktertípusokat is definiálhatunk:

type Cards is ('7', '8', '9', 'X', 'J', 'Q', 'K', 'A');

PL/I Sem az eredeti PL/I, sem az ANSI X3.53–1976 nem tartalmaz felsorolásokat, de az IBM Enterprise PL/I ordinális típusokkal rendelkezik.

Egy ordinális változó nem használható közvetlenül alsó indexként vagy DO TO korlátként. Azonban A first és last típusfüggvények, a beépített binaryvalue, ordinalpred és ordinalsucc függvények pedig közvetve teszik ezt lehetővé. A DO UOTHRU és a DO DOWNTO sorszámok támogatása

define ordinal foo (green,with,envy); declare ix ordinal foo, bar(first(:foo:):last(:foo:)) fixed bin; do i = first(:foo:) to last(:foo:); bar(i)=13; end; do ix=first(:foo:) repeat ordinalsucc(ix) until (ix=first(:foo:)) /* stop on wrap around. */; i = binaryvalue(ix); display (bar(i) || ' at ' || ix); end;

C és szintaktikailag hasonló nyelvek

C A C programozási nyelv eredeti K&R dialektusában nem voltak felsorolt típusok. A C-ben a felsorolásokat explicit definíciók hozzák létre (az enum kulcsszó önmagában nem okoz tárhelyfoglalást), amelyek az enum kulcsszót használják, és a struct és union definíciókra emlékeztetnek:

typedef enum { CLUBS, DIAMONDS, HEARTS, SPADES } CardSuit;

typedef struct { CardSuit suit; short int value; } Card;

Card hand; CardSuit trump;

A C nyelv közvetlenül a programozó számára teszi elérhetővé a felsorolási értékek egész számként való ábrázolását. Az egész számok és az felsorolási értékek szabadon keverhetők, és az felsorolási értékeken végzett minden aritmetikai művelet megengedett. Az is lehetséges, hogy egy felsorolási változó olyan egész számot tartalmazzon, amely nem képviseli a felsorolási értékek egyikét sem. Valójában a nyelvi definíció szerint a fenti kód a Clubs, Diamonds, Hearts és Spades-t int típusú konstansokként definiálja, amelyek csak akkor (csendben) alakulnak át felsorolássá, ha egy ilyen típusú változóban vannak tárolva.

A C nyelv lehetővé teszi a programozó számára, hogy explicit módon, típus nélkül is kiválassza a felsorolási állandók értékeit. Például,

enum CardSuit { CLUBS = 1, DIAMONDS = 2, HEARTS = 4, SPADES = 8

használható egy olyan típus definiálására, amely lehetővé teszi a matematikai színű halmazok felsorolt -ként való ábrázolását bitenkénti logikai műveletekkel.

A C23 óta a felsorolás mögöttes típusát a programozó adhatja meg, ugyanazzal a szintaxissal, mint a C++. Ez lehetővé teszi a programozók számára, hogy optimalizált felsorolásokat készítsenek egy olcsóbb mögöttes típus kiválasztásával.

enum CardSuit : char { CLUBS = 1, DIAMONDS = 2, HEARTS = 4, SPADES = 8

A C nyelvben az enum-ok nincsenek hatókörbe korlátozva vagy minősítve, mivel a C-ből hiányoznak a névtér-funkciók. A constexpr kulcsszó C23-ban való bevezetése előtt az enum-okat gyakran használták fordítási idejű állandók deklarálására a C preprocesszor használata nélkül.

C#