Tip enumerat (enumerare abreviată , enumerare ing. , tip enumerat ) - în programare tip de date , al cărui set de valori este o listă limitată de identificatori.
Un tip enumerat este definit ca un set de identificatori care, din punct de vedere al limbajului, joacă același rol ca constantele denumite obișnuite, dar sunt asociate cu acel tip. Descrierea clasică a unui tip de enumerare în Pascal este următoarea:
tip Cardsuit = ( club , diamante , inimioare , pică ) ;Aici este declarat tipul de date Cardsuit, ale cărui valori pot fi oricare dintre cele patru constante enumerate. O variabilă de tip Cardsuitpoate lua una dintre valori clubs, diamonds, hearts, spades, este permisă compararea valorilor tipului de enumerare pentru egalitate sau inegalitate, precum și utilizarea lor în instrucțiunile de selecție (în Pascal - case) ca valori care identifică opțiuni.
Utilizarea enumerărilor face posibilă ca codurile sursă ale programelor să fie mai lizibile, deoarece acestea permit înlocuirea „numerelor magice” care codifică anumite valori cu nume lizibile.
Pe baza enumerarilor din unele limbi, pot fi create seturi de tipuri . În astfel de cazuri, un set este înțeles (și descris) ca o colecție neordonată de valori unice de tip enumerare.
Un tip enumerat poate fi utilizat în declarații de variabile și parametri formali ai funcțiilor (proceduri, metode). Valorile unui tip enumerat pot fi atribuite variabilelor corespunzătoare și pot fi trecute prin parametrii tipurilor corespunzătoare în funcții. În plus, compararea valorilor enumerate pentru egalitate și inegalitate este întotdeauna acceptată. Unele limbi acceptă și alți operatori de comparație pentru valorile tipurilor enumerate. Rezultatul comparării a două valori enumerate în astfel de cazuri este determinat, de regulă, de ordinea acestor valori în declarația de tip - valoarea care apare mai devreme în declarația de tip este considerată „mai mică” decât valoarea care apare mai tarziu. Uneori, un tip enumerat sau un interval de valori ale unui tip enumerat poate fi, de asemenea, utilizat ca tip de index pentru o matrice. În acest caz, există un element în matrice pentru fiecare valoare a intervalului selectat, iar ordinea reală a elementelor corespunde ordinii valorilor din declarația de tip.
În mod normal, în timpul compilării, valorile de enumerare sunt reprezentate folosind numere întregi. În funcție de limbajul de programare specific, o astfel de reprezentare poate fi fie complet ascunsă de programator, fie disponibilă pentru acesta folosind anumite „soluții de soluționare” (de exemplu, conversia forțată a unei valori de tip enumerare la o valoare de tip „întreg”) sau chiar controlat de programator (în astfel de cazuri, programatorul are posibilitatea de a specifica în mod explicit cu ce numere vor fi codificate toate sau unele valori ale tipului de enumerare. Toate opțiunile au aspectele lor pozitive și negative. Pe de o parte, capacitatea de a utiliza valorile numerice ale constantelor care alcătuiesc tipul de enumerare, în special atunci când este abuzată, privează utilizarea acestor tipuri și creează pericolul erorilor (când se utilizează valori numerice pentru care nu există constante corespunzătoare în tip). Pe de altă parte, managementul explicit al valorii oferă câteva caracteristici suplimentare. De exemplu, permite utilizarea unor tipuri de enumerare atunci când se organizează o interfață cu module scrise în alte limbi, dacă acestea folosesc sau returnează valori codate întregi dintr-un set predefinit.
O altă posibilitate pe care o oferă tipurile enumerate la nivelul implementării limbajului este salvarea memoriei. Cu o cantitate mică de tip enum, câțiva biți sunt suficienți pentru a stoca o valoare de acest tip (tipul de mai sus Cardsuitnecesită doar doi biți pe valoare, în timp ce un număr întreg standard pe cele mai multe arhitecturi utilizate necesită 32 de biți - de 16 ori mai mult), iar compilatorul poate folosi acest fapt pentru a compacta stocarea datelor în memorie. Acest lucru poate fi deosebit de important dacă mai multe valori ale tipurilor de enumerare sunt stocate într-o singură înregistrare - compactarea înregistrărilor la procesarea unui număr mare de ele poate elibera multă memorie. De obicei, compilatorii nu implementează această caracteristică, cel puțin nu în vremurile recente, când memoria computerului a devenit mult mai ieftină.
Tipul de enumerare este tradițional pentru limbajele de programare dezvoltate, este folosit destul de larg și este adesea considerat de la sine înțeles. Cu toate acestea, acest tip nu este lipsit de critici din partea teoreticienilor și practicienilor în programare. Deci, la dezvoltarea limbajului de programare Oberon , tipurile enumerate au fost incluse în lista de caracteristici care au fost eliminate din limbaj. Niklaus Wirth , designerul limbii, a invocat următoarele motive:
Pe de altă parte, de exemplu, în Java , care inițial nu conținea un tip enumerat, acest tip a fost introdus ulterior din motive nu numai de comoditate, ci și de fiabilitate: problema utilizării unor grupuri de constante numite în locul enumerațiilor este că există nu există nici un control din partea compilatorului cu privire la unicitatea constantelor de valori, precum și posibilitatea de a atribui aleatoriu valori variabilelor care nu corespund cu niciuna dintre aceste constante.
În limbajul Ada, enumerările sunt specificate folosind un cuvânt cheie isurmat de o listă de valori separate prin virgulă:
tipul Cardsuit este ( cluburi , diamante , inimioare , pică );Dialectul original K&R din C nu avea tipuri enumerate, totuși acestea au fost adăugate în standardul ANSI C.
enum cardsuit { CLUBURI , DIAMANTE , INIMILE , PICĂ };Limbile dinamice, slab tastate, cu sintaxă asemănătoare C (cum ar fi perl sau JavaScript ) nu au, în general, enumerari.
C++Enumerările C++ moștenesc în mod direct comportamentul enumerarilor C, cu excepția faptului că tipul enumerat în C++ este un tip real, iar cuvântul cheie enumeste folosit doar atunci când se declară un astfel de tip. Dacă, la procesarea unui parametru care este o enumerare, orice valoare din enumerare nu este procesată (de exemplu, unul dintre elementele de enumerare a fost uitat să fie procesat în construcție switch), atunci compilatorul poate emite un avertisment despre valoarea uitată. [2]
C++11 furnizează un al doilea tip de enumerare, sigur de tip, care nu este implicit convertibil într-un tip integral. Aceasta este definită de sintagma „enum class”. De exemplu:
enum class Culoare { Roșu , Verde , Albastru };Un tip de bază este o implementare a unui anumit tip integral care este suficient de mare pentru a păstra toate valorile enumerate (nu trebuie să fie cel mai mic tip posibil!). În C++, puteți specifica direct tipul de bază. Acest lucru permite „declarații înainte” ale enumerarilor:
enum class Culoare : lung { Roșu , Verde , Albastru }; // trebuie să se potrivească cu dimensiunea și aspectul clasei de enumerare a tipului de memorie "long" Shapes : char ; // declarație preliminară. Dacă sunt definite ulterior valori care nu se potrivesc în „char”, aceasta este o eroare. C# enum Cardsuit { Clubs , Diamonds , Spades , Hearts } JavaÎn Java originală, nu existau enumerari; în schimb, s-a propus să se utilizeze clase cu constante statice. Deoarece enumerările din versiunea 5 (1.5) au fost introduse în limbaj, acestea sunt o clasă cu drepturi depline în care puteți adăuga un număr arbitrar de câmpuri și metode. Au fost introduse enumerari pentru a îmbunătăți controlul siguranței tipului. [3]
enum Cardsuit { Clubs , Diamonds , Spades , Hearts } Kotlin enum class Direcție { NORD , SUD , VEST , EST }În unele limbaje de programare (de exemplu, Haskell), enumerațiile pot fi emulate folosind tipuri algebrice . De exemplu, un tip boolean care conține doi identificatori pentru a reprezenta valorile de adevăr este codificat astfel:
date Bool = False | Adevărat
Tipuri de date | |
---|---|
Ininterpretabil | |
Numeric | |
Text | |
Referinţă | |
Compozit | |
abstract |
|
Alte | |
subiecte asemănătoare |