Pe scurt
În C/C++, programatorul poate defini nume de tipuri pentru a exprima mai clar rolul datelor. typedef creează un alias pentru un tip existent, iar în C++ using poate face același lucru. O enumerare definește un tip ale cărui valori poartă nume, potrivit pentru stări precum „oprit”, „pornit” sau „pauză”. Un alias nu creează un tip distinct; o enumerare creează un tip enumerat.
using NumarElevi = int;
enum class Stare { oprit, pornit, pauza };
NumarElevi n = 28;
Stare s = Stare::pornit;
Variabila n are tipul int sub un nume mai clar. Variabila s are tipul Stare și valoarea pornit. Folosirea acestor nume poate preveni confuzii între categorii de date, dar nu înlocuiește verificarea valorilor primite la intrare.
În detaliu
În C și C++, programatorul poate da nume noi tipurilor și poate defini tipuri ale căror valori sunt nume. Aliasul de tip se scrie în C și C++ cu typedef, iar în C++ și cu using: typedef unsigned long long ULL; și using ULL = unsigned long long; au același efect. Numele ULL și tipul de bază sunt interschimbabile la declararea variabilelor, deci un alias nu creează un tip distinct, ci doar un nume mai scurt sau mai clar. Enumerarea definește un tip cu un număr mic de valori numite. Fiecare nume (enumerator) primește o valoare întreagă: primul are implicit 0, iar următorii cresc cu 1; valoarea poate fi fixată explicit, iar numerotarea continuă de la ea. În C++ există și enum class (C++11), care limitează numele în domeniul enumerării și interzice conversia implicită la int; în C această construcție nu există.
Exemplul 1 — aliasuri. NumarElevi se folosește pentru un contor, iar ULL pentru valori mari fără semn.
#include <iostream>
using namespace std;
typedef unsigned long long ULL;
using NumarElevi = int;
int main() {
ULL mare = 18446744073709551615ULL;
NumarElevi n = 28;
cout << mare << ' ' << n << ' ' << sizeof(ULL);
return 0;
}
Programul afișează 18446744073709551615 28 8: cea mai mare valoare a tipului unsigned long long este , iar tipul ocupă 8 octeți. NumarElevi este tot un int; numele arată doar ce reprezintă variabila. Numele nu înlocuiește verificarea datelor: dacă se citește un număr negativ de elevi, tipul nu îl respinge.
Exemplul 2 — enumerare cu valori implicite și explicite. Pentru zilele unei săptămâni putem scrie enum Zi { luni = 1, marti, miercuri };. Enumeratorii primesc valorile 1, 2 și 3, deoarece după luni = 1 numerotarea continuă din unu în unu. O variabilă Zi d = miercuri; are valoarea 3, iar cout << d afișează 3, pentru că un enum obișnuit se convertește implicit la int. La enum class Stare { oprit, pornit, pauza }; numele se scriu Stare::pornit, iar afișarea cere conversie explicită: static_cast<int>(Stare::pornit) dă 1.
Exemplul 3 — valorile unei enumerări cu salturi. În enum E { a = 2, b, c = 8, d }; valorile sunt , , și . Enumeratorul b continuă de la a, iar d continuă de la c. Un enumerator poate primi și o valoare deja folosită, de pildă enum F { x = 1, y = 1 };, deci enumeratorii nu sunt neapărat distincți.
Exemplul 4 — enumeratorul-contor. Un ultim enumerator, fără altă semnificație decât numărătoarea, dă numărul de valori ale enumerării și poate fi dimensiunea unui tablou:
enum Zi { luni, marti, miercuri, nrZile };
int ore[nrZile] = {2, 0, 3};
int total = 0;
for (int z = luni; z < nrZile; ++z)
total += ore[z];
cout << total;
Enumeratorii au valorile 0, 1, 2, iar nrZile este 3, deci tabloul are trei elemente, iar ciclul adună și afișează 5. Între limbaje există o diferență: în C instrucțiunea enum Zi z = 1; este permisă, pe când în C++ atribuirea unui întreg unei variabile de tip enumerat cere conversie explicită, static_cast<Zi>(1). Enumeratorii sunt constante: instrucțiunea luni = 5; nu compilează, ca la o variabilă declarată cu const. În schimb, ei se pot compara, iar z < nrZile ordonează după valorile întregi ale enumeratorilor.
Enumerările sunt potrivite pentru stări, categorii și zile, adică pentru mulțimi mici de valori, iar aliasurile pentru nume de tipuri lungi sau pentru a exprima rolul datelor. Într-un switch, enumeratorii pot fi etichetele case, ceea ce face codul mai ușor de citit decât numerele 0, 1, 2.
Pentru admitere
La citirea codului, separă numele tipului de valoarea variabilei. typedef int T; T x = 5; declară un întreg x cu valoarea 5, nu un tip numeric nou cu alte reguli. În enum E { a = 2, b, c = 8, d }; valorile sunt . Sintaxa permisă depinde de limbajul precizat în subiect: typedef și enum sunt disponibile în C și C++, în timp ce using Alias = Tip; și enum class sunt construcții C++. În C, după definirea enum E { ... }; o variabilă se declară enum E x;, pe când în C++ este suficient E x;. Pentru o probă formulată în C, răspunsul trebuie scris în C, chiar dacă un exemplu de liceu a fost prezentat în C++. La Bac, urmărește varianta C/C++ indicată de subiect și nu transforma aliasul într-un tip distinct.
Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
enum E { a = 2, b, c = 8, d };
cout << a + b + c + d;
- a) 6
- b) 10
- c) 22
- d) 17
Răspunsul corect este c). Valorile enumeratorilor sunt , , și , deoarece b continuă de la a, iar d de la c. Suma lor este . Varianta a) ar rezulta dacă numerotarea ar începe de la 0 și ar ignora valorile explicite: . Varianta b) adună numai valorile scrise explicit, . Varianta d) ar rezulta dacă după c = 8 numerotarea ar relua de la valoarea lui b, adică d ar fi 4. Valorile enumeratorilor se determină parcurgând enumerarea de la stânga la dreapta și continuând de la ultima valoare.
Greșeli frecvente
- Greșit:
typedef int T;creează un tip nou, incompatibil cuint.Corect:Teste doar un alt nume pentruint. - Greșit: într-o enumerare, valorile cresc mereu de la 0.Corect: un enumerator cu valoare explicită schimbă punctul de la care continuă numerotarea.
- Greșit:
enum classexistă și în limbajul C.Corect: este o construcție C++ (C++11); în C se foloseșteenum.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3 și 6; aplicabilitatea 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
- OMECTS 4800/2010, anexa 2, Informatică, p. 5–6; edu.ro
Documente consultate
- cppreference, „Enumeration declaration” și „Type alias, alias template”, secțiunile de sintaxă; en.cppreference.com
- UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121)
- Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3 și 6; aplicabilitate din 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro
Desene: Redactare proprie (desen original)
