Enum trong C là kiểu dữ liệu do người dùng định nghĩa. Nó được sử dụng chủ yếu để gán các tên cho các hằng số, các tên giúp một chương trình dễ đọc và bảo trì.
Từ khóa 'enum' được sử dụng để khai báo các kiểu liệt kê mới trong C và C++. Sau đây là cú pháp về khai báo enum.
Cú pháp:
enum enum_name{constant1, constant2, constant3, .......};
Các biến enum có thể được định nghĩa theo 2 cách:
// trong ca 2 truong hop duoi day, "day" // duoc dinh nghia nhu bien cua kieu week enum week{Mon, Tue, Wed}; enum week day; // hoac enum week{Mon, Tue, Wed} day;
Ví dụ sử dụng enum trong C:
#include<stdio.h> enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun}; int main() { enum week day; day = Wed; printf("Chi so cua Wed la %d\n", day); // duyet tat ca cac chi so phan tu cua enum week int i; for (i = Mon; i <= Sun; i++) printf("%d ", i); return 0; }
Kết quả:
Chi so cua Wed la 2 0 1 2 3 4 5 6
Trong ví dụ này, vòng lặp for sẽ chạy từ i = 0 đến i = 6, như ban đầu giá trị của i là Mon là 0 và giá trị của tháng Sun là 6.
Nội dung chính
Đặc điểm thú vị về khơi tạo enum
1. Hai biến enum có thể có cùng giá trị. Ví dụ, trong chương trình C sau cả 'Failed' và 'Error' có cùng giá trị 0.
#include <stdio.h> enum status {Working = 1, Failed = 0, Error = 0}; int main() { printf("%d, %d, %d", Working, Failed, Error); return 0; }
Kết quả:
1, 0, 0
2. Nếu chúng ta không gán giá trị cho tên enum một cách rõ ràng, trình biên dịch theo mặc định gán giá trị bắt đầu từ 0. Ví dụ, trong chương trình C sau, sunday sẽ nhận giá trị 0, sunday được 1, v.v.
#include <stdio.h> enum day {sunday, monday, tuesday, wednesday, thursday, friday, saturday}; int main() { enum day d1 = monday; enum day d2 = tuesday; printf("So ngay duoc luu tru trong bien d1 la %d\n", d1); printf("So ngay duoc luu tru trong bien d2 la %d\n", d2); return 0; }
Kết quả:
So ngay duoc luu tru trong bien d1 la 1 So ngay duoc luu tru trong bien d2 la 2
3. Chúng tôi có thể gán giá trị cho một số tên theo bất kỳ thứ tự nào. Tất cả các tên chưa được chỉ định nhận giá trị là giá trị của tên trước đó cộng với một.
#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; }
Kết quả:
1 2 5 6 10 11 12
4. Giá trị được gán cho tên enum phải là một số hằng số nguyên, tức là, giá trị phải nằm trong phạm vi từ giá trị nguyên nhỏ nhất có thể đến giá trị nguyên lớn nhất.
5. Tất cả các hằng số enum phải là duy nhất trong phạm vi của chúng. Ví dụ, chương trình sau bị lỗi trong quá trình biên dịch.
#include <stdio.h> enum state {working, failed}; enum result {failed, passed}; int main() { return 0; }
Kết quả:
[Error] redeclaration of enumerator 'failed' [Note] previous definition of 'failed' was here
Enum với Macro
Chúng ta cũng có thể sử dụng các macro để định nghĩa hằng số. Ví dụ, chúng ta có thể định nghĩa 'Working' và 'Failed' bằng cách sử dụng macro sau.
#include <stdio.h> #define Working 0 #define Failed 1 #define Done 2 int main() { printf("%d, %d, %d", Working, Failed, Done); return 0; }
Kết quả:
0, 1, 2
Enum có nhiều lợi thế hơn Macro khi đặt tên các hằng cố có giá trị đầy đủ.
- Enum tuân theo các quy tắc phạm vi.
- Các biến Enum được gán giá trị tự động. Ví dụ sau tương đương với Enum.
enum state {Working, Failed, Done};