Рубрики

Перечисление (или перечисление) в C

Перечисление (или enum) является определяемым пользователем типом данных в C. Он в основном используется для присвоения имен интегральным константам, имена облегчают чтение и обслуживание программы.

enum State {Working = 1, Failed = 0}; 

Ключевое слово enum используется для объявления новых типов перечисления в C и C ++. Ниже приведен пример объявления enum.

// The name of enumeration is "flag" and the constant
// are the values of the flag. By default, the values
// of the constants are as follows:
// constant1 = 0, constant2 = 1, constant3 = 2 and 
// so on.
enum flag{constant1, constant2, constant3, ....... };

Переменные типа enum также могут быть определены. Их можно определить двумя способами:

// In both of the below cases, "day" is 
// defined as the variable of type week. 

enum week{Mon, Tue, Wed};
enum week day;

// Or

enum week{Mon, Tue, Wed}day;

// Пример программы для демонстрации работы
// перечисления в C
#include<stdio.h>

  

enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};

  

int main()

{

    enum week day;

    day = Wed;

    printf("%d",day);

    return 0;

Выход:

2

В приведенном выше примере мы объявили «день» в качестве переменной, а значение «Ср» присвоено дню, который равен 2. Таким образом, в результате выводится 2.

Другой пример перечисления:

// Еще один пример программы для демонстрации работы
// перечисления в C
#include<stdio.h>

  

enum year{Jan, Feb, Mar, Apr, May, Jun, Jul, 

          Aug, Sep, Oct, Nov, Dec};

  

int main()

{

   int i;

   for (i=Jan; i<=Dec; i++)      

      printf("%d ", i);

        

   return 0;

}

Выход:

0 1 2 3 4 5 6 7 8 9 10 11

В этом примере цикл for будет выполняться с i = 0 до i = 11, так как изначально значение i равно Jan, что равно 0, а значение Dec равно 11.

Интересные факты об инициализации enum.
1. Два перечислимых имени могут иметь одинаковое значение. Например, в следующей C-программе «Failed» и «Freezed» имеют одинаковое значение 0.

#include <stdio.h>

enum State {Working = 1, Failed = 0, Freezed = 0};

  

int main()

{

   printf("%d, %d, %d", Working, Failed, Freezed);

   return 0;

}

Выход:

1, 0, 0

2. Если мы не присваиваем значения явно именам перечислений, компилятор по умолчанию присваивает значения начиная с 0. Например, в следующей программе на C воскресенье получает значение 0, понедельник — 1 и так далее.

#include <stdio.h>

enum day {sunday, monday, tuesday, wednesday, thursday, friday, saturday};

  

int main()

{

    enum day d = thursday;

    printf("The day number stored in d is %d", d);

    return 0;

}

Выход:

The day number stored in d is 4

3. Мы можем присвоить значения какому-либо имени в любом порядке. Все неназначенные имена получают значение как значение предыдущего имени плюс один.

#include <stdio.h>

enum day {sunday = 1, monday, tuesday = 5,

          wednesday, thursday = 10, friday, saturday};

  

int main()

{

    printf("%d %d %d %d %d %d %d", sunday, monday, tuesday,

            wednesday, thursday, friday, saturday);

    return 0;

}

Выход:

1 2 5 6 10 11 12

4. Значение, присвоенное именам перечислений, должно быть некоторой целочисленной константой, т. Е. Значение должно находиться в диапазоне от минимально возможного целочисленного значения до максимально возможного целочисленного значения.

5. Все константы перечисления должны быть уникальными по своему объему. Например, следующая программа завершается неудачно при компиляции.

enum state  {working, failed};

enum result {failed, passed};

  

int main()  { return 0; }

Выход:

Compile Error: 'failed' has a previous declaration as 'state failed'

Упражнение:
Предсказать вывод следующих программ на C

Программа 1:

#include <stdio.h>

enum day {sunday = 1, tuesday, wednesday, thursday, friday, saturday};

  

int main()

{

    enum day d = thursday;

    printf("The day number stored in d is %d", d);

    return 0;

}

Программа 2:

#include <stdio.h>

enum State {WORKING = 0, FAILED, FREEZED};

enum State currState = 2;

  

enum State FindState() {

    return currState;

}

  

int main() {

   (FindState() == WORKING)? printf("WORKING"): printf("NOT WORKING");

   return 0;

}

Enum vs Macro
Мы также можем использовать макросы для определения имен констант. Например, мы можем определить «Working» и «Failed», используя следующий макрос.

#define Working 0
#define Failed 1
#define Freezed 2

Существует несколько преимуществ использования enum по сравнению с макросом, когда многие связанные именованные константы имеют целочисленные значения.
а) Перечисления следуют правилам области видимости.
б) Переменные перечисления присваиваются автоматически. Следовать проще

enum state  {Working, Failed, Freezed};

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Вступительная часть этой статьи предоставлена Пиюшем Вашиштхой . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Рекомендуемые посты:

Перечисление (или перечисление) в C

0.00 (0%) 0 votes