Felsorolt típus (rövidített felsorolás , eng. enumeration, enumerated type ) - programozási adattípus , amelynek értékkészlete az azonosítók korlátozott listája.
A felsorolt típust olyan azonosítók halmazaként határozzuk meg, amelyek nyelvi szempontból ugyanazt a szerepet töltik be, mint a szabályos nevű állandók, de az adott típushoz kapcsolódnak. A Pascal-féle felsorolástípus klasszikus leírása a következő:
típus Cardsuit = ( ütők , gyémántok , szívek , ásók ) ;Itt deklarálják a Cardsuit adattípust, melynek értéke a felsorolt négy konstans bármelyike lehet. A típusváltozó Cardsuitfelveheti az értékek egyikét, clubs, diamonds, hearts, spadesmegengedett a felsorolástípus értékeinek egyenlőség vagy egyenlőtlenség összehasonlítása, valamint a kiválasztási utasításokban (Pascal - case) történő felhasználása opciókat azonosító értékként.
A felsorolások használata lehetővé teszi a programok forráskódjainak olvashatóbbá tételét, mivel lehetővé teszik bizonyos értékeket kódoló "varázsszámok" olvasható nevekkel való helyettesítését.
Egyes nyelvek felsorolása alapján típuskészletek hozhatók létre . Ilyen esetekben a halmazt egy enum típusú egyedi értékek rendezetlen gyűjteményeként értjük (és írjuk le).
A felsorolt típus használható változók deklarációjában és függvények formális paramétereiben (eljárások, metódusok). A felsorolt típusú értékek hozzárendelhetők a megfelelő változókhoz, és átadhatók a megfelelő típusú paramétereken a függvényekben. Ezenkívül az egyenlőség és az egyenlőtlenség felsorolt értékeinek összehasonlítása mindig támogatott. Egyes nyelvek más összehasonlító operátorokat is támogatnak a felsorolt típusú értékekhez. A két felsorolt érték összehasonlításának eredményét ilyen esetekben általában a típusdeklarációban szereplő értékek sorrendje határozza meg - a típusdeklarációban korábban előforduló értéket tekintjük "kisebbnek", mint az később következik be. Néha egy felsorolt típus vagy egy felsorolt típusú érték bizonyos tartománya is használható egy tömb indextípusaként. Ebben az esetben a kiválasztott tartomány minden értékéhez tartozik egy elem a tömbben, és az elemek tényleges sorrendje megfelel a típusdeklarációban szereplő értékek sorrendjének.
Általában az összeállítás során a felsorolási értékeket egész számokkal ábrázolják. Az adott programozási nyelvtől függően egy ilyen ábrázolás vagy teljesen elrejthető a programozó elől, vagy bizonyos „megkerülő megoldások” segítségével elérhető (például egy enum típusú érték kényszerített konvertálása „egész” típusú értékké), vagy akár a programozó vezérli (ilyen esetekben a programozónak lehetősége van kifejezetten megadni, hogy az enum típusú összes vagy néhány értéket milyen számokkal kódoljon. Minden lehetőségnek megvannak a maga pozitívumai és negatívumai. Egyrészt a felsorolástípust alkotó konstansok számértékeinek használatának képessége, különösen akkor, ha visszaélnek vele, megfosztja e típusok használatát, és hibaveszélyt jelent (a számértékek használatakor amelyeknek a típusban nincsenek megfelelő állandók). Másrészt az explicit értékkezelés néhány további funkciót is biztosít. Például lehetővé teszi az enum típusok használatát más nyelven írt modulokkal való interfész szervezésekor, ha azok valamilyen előre meghatározott halmazból egész számmal kódolt értékeket használnak vagy adnak vissza.
Egy másik lehetőség, amelyet a felsorolt típusok nyújtanak a nyelvi megvalósítás szintjén, a memóriatakarékosság. Kis mennyiségű enum típus esetén néhány bit elegendő egy ilyen típusú érték tárolásához (a fenti típus Cardsuitcsak két bitet igényel értékenként, míg a szabványos egész szám a legtöbb használt architektúrán 32 bitet – 16-szor többet), és a A fordító ezt a tényt felhasználhatja az adatok memóriában való tárolására. Ez különösen akkor lehet fontos, ha egy rekordban több enum-típus értéket tárolnak – a rekordok tömörítése nagyszámú feldolgozáskor sok memóriát szabadíthat fel. A fordítók általában nem valósítják meg ezt a funkciót, legalábbis nem az utóbbi időben, amikor a számítógépmemória sokkal olcsóbb lett.
A felsorolás típusa hagyományos a fejlett programozási nyelveknél, meglehetősen széles körben használatos, és gyakran természetesnek tekintik. Ez a típus azonban nem mentes a kritikától a programozás teoretikusai és gyakorlói részéről. Tehát az Oberon programozási nyelv fejlesztésekor felsorolt típusok szerepeltek a nyelvből eltávolított szolgáltatások listáján. Niklaus Wirth , a nyelv tervezője a következő okokra hivatkozott:
Másrészt például a kezdetben felsorolt típust nem tartalmazó Java -ban ezt a típust utólag nemcsak kényelmi, hanem megbízhatósági okokból is bevezették: a felsorolás helyett az elnevezett konstanscsoportok használatának problémája az, hogy nem szabályozza a fordító az értékállandók egyediségét, valamint annak lehetőségét, hogy véletlenszerűen hozzárendeljenek értékeket olyan változókhoz, amelyek nem felelnek meg ezen állandók egyikének sem.
Az Ada nyelven a felsorolások megadása kulcsszóval is, majd vesszővel elválasztott értéklistával történik:
típusú Cardsuit is ( ütők , gyémántok , szívek , ásók );A C eredeti K&R nyelvjárásában nem voltak felsorolt típusok, de az ANSI C szabványba bekerültek .
enum cardsuit { KLUBOK , GYÉMÁNT , SZÍVEK , ásó };A dinamikus, gyengén tipizált nyelvek C-szerű szintaxissal (például perl vagy JavaScript ) általában nem tartalmaznak enumokat.
C++A C++ enumok közvetlenül öröklik a C enumok viselkedését, azzal a különbséggel, hogy a felsorolt típus a C++-ban valós típus, és a kulcsszó enumcsak ilyen típus deklarálásakor használatos. Ha egy felsorolásnak minősülő paraméter feldolgozásakor a felsorolásból származó bármely érték nem kerül feldolgozásra (például az egyik felsorolási elemet elfelejtették feldolgozni a konstrukcióban switch), akkor a fordító figyelmeztetést adhat ki az elfelejtett értékre. [2]
A C++11 egy második, típusbiztos enumtípust biztosít, amely nem konvertálható implicit módon integrált típussá. Ezt az "enum osztály" kifejezés határozza meg. Például:
enum class Szín { Piros , Zöld , Kék };Az alaptípus egy bizonyos integráltípus megvalósítása, amely elég nagy ahhoz, hogy az összes felsorolt értéket tartalmazza (nem kell a lehető legkisebb típusnak lennie!). A C++ nyelven közvetlenül megadhatja az alaptípust. Ez lehetővé teszi az enumok "további deklarációit":
enum osztály Szín : hosszú { Piros , Zöld , Kék }; // meg kell egyeznie a memóriatípus "long" enum class méretével és elrendezésével Alakzatok : char ; // előzetes nyilatkozat. Ha később olyan értékeket definiálnak, amelyek nem férnek el a 'char'-ban, ez hiba. C# enum Cardsuit { Klubok , gyémántok , pikkek , szívek } JavaAz eredeti Java-ban nem voltak enumok, ehelyett statikus állandókkal rendelkező osztályok használatát javasolták. Amióta az 5-ös verziójú (1.5) felsorolások bekerültek a nyelvbe, ezek egy teljes értékű osztály, amelyben tetszőleges számú mezőt és metódust adhatunk hozzá. Az enumokat a típusbiztonsági ellenőrzés javítása érdekében vezették be. [3]
enum Cardsuit { Klubok , gyémántok , pikkek , szívek } Kotlin enum class Irány { ÉSZAK , DÉL , NYUGAT , KELET }Egyes programozási nyelvekben (pl. Haskell) a felsorolások emulálhatók algebrai típusokkal . Például egy logikai típus, amely két azonosítót tartalmaz az igazságértékek megjelenítésére, a következőképpen van kódolva:
adatok Bool = False | Igaz
Adattípusok | |
---|---|
Értelmezhetetlen | |
Numerikus | |
Szöveg | |
Referencia | |
Összetett | |
absztrakt | |
Egyéb | |
Kapcsolódó témák |