Преброяването в C е известно също като изброен тип. Това е дефиниран от потребителя тип данни, който се състои от цели числа и предоставя смислени имена на тези стойности. Използването на enum в C прави програмата лесна за разбиране и поддръжка. Enum се дефинира с помощта на ключовата дума enum.
Следното е начинът за дефиниране на enum в C:
enum flag{integer_const1, integer_const2,.....integter_constN};
В горната декларация ние дефинираме enum, наречен като флаг, съдържащ 'N' целочислени константи. Стойността по подразбиране на integer_const1 е 0, integer_const2 е 1 и т.н. Можем също така да променим стойността по подразбиране на целочислените константи по време на декларацията.
Например:
enum fruits{mango, apple, strawberry, papaya};
Стойността по подразбиране за манго е 0, ябълка е 1, ягода е 2 и папая е 3. Ако искаме да променим тези стойности по подразбиране, тогава можем да направим както е дадено по-долу:
enum fruits{ mango=2, apple=1, strawberry=5, papaya=7, };
Декларация на изброен тип
Както знаем, че в езика C трябва да декларираме променлива от предварително дефиниран тип като int, float, char и т.н. По подобен начин можем да декларираме променлива от дефиниран от потребителя тип данни, като например enum. Нека да видим как можем да декларираме променлива от тип enum.
Да предположим, че създаваме enum на тип status, както е показано по-долу:
enum status{false,true};
Сега създаваме променлива от тип статус:
enum status s; // creating a variable of the status type.
В горния оператор сме декларирали променливата 's' от тип status.
За да създадете променлива, горните две твърдения могат да бъдат записани като:
enum status{false,true} s;
В този случай стойността по подразбиране на false ще бъде равна на 0, а стойността на true ще бъде равна на 1.
Нека създадем проста програма от 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; }
В горния код създаваме тип enum, наречен като дни от седмицата, и той съдържа името на всичките седем дни. Присвоихме 1 стойност на неделята и всички останали имена ще получат стойност като предишната стойност плюс едно.
Изход
Нека демонстрираме друг пример, за да разберем по-ясно enum.
#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++)>
Изход
Някои важни точки, свързани с enum
- Имената на enum, налични в тип enum, могат да имат една и съща стойност. Нека да разгледаме примера.
#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; }
Изход
- Ако не предоставим никаква стойност на имената на enum, тогава компилаторът автоматично ще присвои стойностите по подразбиране на имената на enum, започвайки от 0.
- Можем също така да предоставим стойностите на името на enum в произволен ред и неприсвоените имена ще получат стойността по подразбиране като предишното плюс едно.
- Стойностите, присвоени на имената на enum, трябва да бъдат интегрална константа, т.е. не трябва да бъдат от други типове като низ, плаваща единица и т.н.
- Всички имена на enum трябва да бъдат уникални по своя обхват, т.е. ако дефинираме две enum с еднакъв обхват, тогава тези две enum трябва да имат различни имена на enum, в противен случай компилаторът ще изведе грешка.
Нека разберем този сценарий чрез пример.
#include enum status{success, fail}; enum boolen{fail,pass}; int main(void) { printf('The value of success is %d', success); return 0; }
Изход
- При изброяването можем да дефинираме изброен тип данни и без името.
#include enum {success, fail} status; int main(void) { status=success; printf('The value of status is %d', status); return 0; }
Изход
Enum срещу Macro в C
- Макросът може също да се използва за дефиниране на константите на имената, но в случай на enum, всички константи на имената могат да бъдат групирани заедно в един оператор.
Например,
# дефиниране на пропуск 0;
# дефиниране на успех 1;
Горните два оператора могат да бъдат записани в един оператор чрез използване на типа enum.
enum статус {проход, успех}; - Типът enum следва правилата за обхват, докато макросът не следва правилата за обхват.
- В Enum, ако не присвоим стойностите на имената на enum, тогава компилаторът автоматично ще присвои стойността по подразбиране на имената на enum. Но в случай на макро, стойностите трябва да бъдат изрично зададени.
- Типът на enum в C е цяло число, но типът на макроса може да бъде от всякакъв тип.
=december;i++)>