Enumeration (or enum) is a user defined data type in C. It is mainly used to assign names to integral constants, the names make a program easy to read and maintain.
 

Hereby mistake, the state of wed is 2, it should be 3. Please refer to the same example below for a better understanding.

 

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

The keyword ‘enum’ is used to declare new enumeration types in C and C++. Following is an example of enum declaration. 
 

// 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, ....... };

Variables of type enum can also be defined. They can be defined in two ways: 
 

// 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;

 

Output: 
 

2

In the above example, we declared “day” as the variable and the value of “Wed” is allocated to day, which is 2. So as a result, 2 is printed.
Another example of enumeration is: 
 

Output: 
 

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

In this example, the for loop will run from i = 0 to i = 11, as initially the value of i is Jan which is 0 and the value of Dec is 11. 
Interesting facts about initialization of enum. 
1. Two enum names can have same value. For example, in the following C program both ‘Failed’ and ‘Freezed’ have same value 0. 
 

Output: 

1, 0, 0

2. If we do not explicitly assign values to enum names, the compiler by default assigns values starting from 0. For example, in the following C program, sunday gets value 0, monday gets 1, and so on. 
 

Output: 

The day number stored in d is 4

3. We can assign values to some name in any order. All unassigned names get value as value of previous name plus one. 
 

Output: 

1 2 5 6 10 11 12

4. The value assigned to enum names must be some integral constant, i.e., the value must be in range from minimum possible integer value to maximum possible integer value.
5. All enum constants must be unique in their scope. For example, the following program fails in compilation. 
 

Output: 

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

Exercise: 
Predict the output of following C programs
Program 1: 
 

Program 2: 
 

Enum vs Macro 
We can also use macros to define names constants. For example we can define ‘Working’ and ‘Failed’ using following macro. 
 

There are multiple advantages of using enum over macro when many related named constants have integral values. 
a) Enums follow scope rules. 
b) Enum variables are automatically assigned values. Following is simpler 
 

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
Introduction part of this article is contributed by Piyush Vashistha. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.