Výčt v C je také známý jako výčtový typ. Je to uživatelsky definovaný datový typ, který se skládá z celočíselných hodnot a poskytuje těmto hodnotám smysluplné názvy. Použití enum v C usnadňuje pochopení a údržbu programu. Výčet je definován pomocí klíčového slova enum.
Následuje způsob, jak definovat výčet v C:
enum flag{integer_const1, integer_const2,.....integter_constN};
Ve výše uvedené deklaraci definujeme výčet pojmenovaný jako příznak obsahující 'N' celočíselné konstanty. Výchozí hodnota integer_const1 je 0, integer_const2 je 1 a tak dále. Můžeme také změnit výchozí hodnotu celočíselných konstant v době deklarace.
Například:
enum fruits{mango, apple, strawberry, papaya};
Výchozí hodnota pro mango je 0, jablko je 1, jahoda je 2 a papája je 3. Pokud chceme tyto výchozí hodnoty změnit, můžeme postupovat následovně:
enum fruits{ mango=2, apple=1, strawberry=5, papaya=7, };
Deklarace výčtového typu
Protože víme, že v jazyce C potřebujeme deklarovat proměnnou předem definovaného typu, jako je int, float, char atd. Podobně můžeme deklarovat proměnnou uživatelem definovaného datového typu, jako je enum. Podívejme se, jak můžeme deklarovat proměnnou typu enum.
Předpokládejme, že vytvoříme výčet stavu typu, jak je znázorněno níže:
enum status{false,true};
Nyní vytvoříme proměnnou typu status:
enum status s; // creating a variable of the status type.
Ve výše uvedeném příkazu jsme deklarovali proměnnou 's' typu status.
Chcete-li vytvořit proměnnou, výše uvedené dva příkazy lze zapsat jako:
enum status{false,true} s;
V tomto případě bude výchozí hodnota false rovna 0 a hodnota true bude rovna 1.
Vytvořme jednoduchý program enum.
#include enum weekdays{Sunday=1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; int main() { enum weekdays w; // variable declaration of weekdays type w=Monday; // assigning value of Monday to w. printf('The value of w is %d',w); return 0; }
Ve výše uvedeném kódu vytvoříme typ výčtu pojmenovaný jako dny v týdnu a obsahuje název všech sedmi dnů. Neděli jsme přiřadili 1 hodnotu a všechna ostatní jména budou mít hodnotu jako předchozí hodnota plus jedna.
Výstup
Ukažme si další příklad, abychom výčtu lépe porozuměli.
#include enum months{jan=1, feb, march, april, may, june, july, august, september, october, november, december}; int main() { // printing the values of months for(int i=jan;i<=december;i++) { printf('%d, ',i); } return 0; < pre> <p>In the above code, we have created a type of enum named as months which consists of all the names of months. We have assigned a '1' value, and all the other months will be given a value as the previous one plus one. Inside the main() method, we have defined a for loop in which we initialize the 'i' variable by jan, and this loop will iterate till December.</p> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-2.webp" alt="Enum in C"> <h3>Why do we use enum?</h3> <p>The enum is used when we want our variable to have only a set of values. For example, we create a direction variable. As we know that four directions exist (North, South, East, West), so this direction variable will have four possible values. But the variable can hold only one value at a time. If we try to provide some different value to this variable, then it will throw the compilation error.</p> <p>The enum is also used in a switch case statement in which we pass the enum variable in a switch parenthesis. It ensures that the value of the case block should be defined in an enum.</p> <p> <strong>Let's see how we can use an enum in a switch case statement.</strong> </p> <pre> #include enum days{sunday=1, monday, tuesday, wednesday, thursday, friday, saturday}; int main() { enum days d; d=monday; switch(d) { case sunday: printf('Today is sunday'); break; case monday: printf('Today is monday'); break; case tuesday: printf('Today is tuesday'); break; case wednesday: printf('Today is wednesday'); break; case thursday: printf('Today is thursday'); break; case friday: printf('Today is friday'); break; case saturday: printf('Today is saturday'); break; } return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-3.webp" alt="Enum in C"> <p> <strong>Some important points related to enum</strong> </p> <ul> <li>The enum names available in an enum type can have the same value. Let's look at the example.</li> </ul> <pre> #include int main(void) { enum fruits{mango = 1, strawberry=0, apple=1}; printf('The value of mango is %d', mango); printf(' The value of apple is %d', apple); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-4.webp" alt="Enum in C"> <ul> <li>If we do not provide any value to the enum names, then the compiler will automatically assign the default values to the enum names starting from 0.</li> <li>We can also provide the values to the enum name in any order, and the unassigned names will get the default value as the previous one plus one.</li> <li>The values assigned to the enum names must be integral constant, i.e., it should not be of other types such string, float, etc.</li> <li>All the enum names must be unique in their scope, i.e., if we define two enum having same scope, then these two enums should have different enum names otherwise compiler will throw an error.</li> </ul> <p> <strong>Let's understand this scenario through an example.</strong> </p> <pre> #include enum status{success, fail}; enum boolen{fail,pass}; int main(void) { printf('The value of success is %d', success); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-5.webp" alt="Enum in C"> <ul> <li>In enumeration, we can define an enumerated data type without the name also.</li> </ul> <pre> #include enum {success, fail} status; int main(void) { status=success; printf('The value of status is %d', status); return 0; } </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/c-tutorial/73/enum-c-6.webp" alt="Enum in C"> <h3>Enum vs. Macro in C</h3> <ul> <li>Macro can also be used to define the name constants, but in case of an enum, all the name constants can be grouped together in a single statement. <br> For example, <br> # define pass 0; <br> # define success 1; <br> The above two statements can be written in a single statement by using the enum type. <br> enum status{pass, success};</li> <li>The enum type follows the scope rules while macro does not follow the scope rules.</li> <li>In Enum, if we do not assign the values to the enum names, then the compiler will automatically assign the default value to the enum names. But, in the case of macro, the values need to be explicitly assigned.</li> <li>The type of enum in C is an integer, but the type of macro can be of any type.</li> </ul> <hr></=december;i++)>
Výstup
Některé důležité body související s enum
- Názvy výčtů dostupné v typu výčtu mohou mít stejnou hodnotu. Podívejme se na příklad.
#include int main(void) { enum fruits{mango = 1, strawberry=0, apple=1}; printf('The value of mango is %d', mango); printf(' The value of apple is %d', apple); return 0; }
Výstup
- Pokud názvům výčtů neposkytneme žádnou hodnotu, pak kompilátor automaticky přiřadí výchozí hodnoty názvům výčtů počínaje 0.
- Můžeme také zadat hodnoty názvu výčtu v libovolném pořadí a nepřiřazené názvy získají výchozí hodnotu jako předchozí plus jedna.
- Hodnoty přiřazené k názvům výčtů musí být integrální konstantní, to znamená, že by neměly být jiného typu, jako je řetězec, float atd.
- Všechny názvy výčtů musí být ve svém rozsahu jedinečné, tj. pokud definujeme dva výčty se stejným rozsahem, pak by tyto dva výčty měly mít různé názvy výčtů, jinak kompilátor vyvolá chybu.
Pojďme pochopit tento scénář na příkladu.
#include enum status{success, fail}; enum boolen{fail,pass}; int main(void) { printf('The value of success is %d', success); return 0; }
Výstup
- Ve výčtu můžeme definovat výčtový datový typ také bez názvu.
#include enum {success, fail} status; int main(void) { status=success; printf('The value of status is %d', status); return 0; }
Výstup
Enum vs. Makro v C
- Makro lze také použít k definování jmenných konstant, ale v případě výčtu lze všechny jmenné konstanty seskupit do jednoho příkazu.
Například,
# definovat průchod 0;
# definovat úspěch 1;
Výše uvedené dva příkazy lze zapsat do jediného příkazu pomocí typu enum.
stav enum{průchod, úspěch}; - Typ výčtu se řídí pravidly oboru, zatímco makro pravidla oboru nedodržuje.
- Pokud ve Enum nepřiřadíme hodnoty k názvům výčtů, pak překladač automaticky přiřadí výchozí hodnotu názvům výčtů. Ale v případě makra musí být hodnoty explicitně přiřazeny.
- Typ výčtu v C je celé číslo, ale typ makra může být libovolného typu.
=december;i++)>