1. Giới thiệu
Kiểu liệt kê (enum
) trong ngôn ngữ C là một công cụ quan trọng giúp cải thiện khả năng đọc và bảo trì mã nguồn. Bài viết này sẽ giải thích chi tiết từ cách sử dụng cơ bản đến các ứng dụng nâng cao của enum
. Dù bạn là người mới bắt đầu hay đã có kinh nghiệm, hướng dẫn này sẽ giúp bạn nắm vững cách sử dụng enum
và trang bị kỹ năng viết mã C hiệu quả hơn.
2. enum
là gì?
Định nghĩa và vai trò của enum
enum
, hay còn gọi là “kiểu liệt kê”, là một kiểu dữ liệu dùng để định nghĩa một tập hợp các hằng số. Thông thường, nó được sử dụng để đặt tên dễ nhận biết cho nhiều hằng số có liên quan. Ví dụ, khi xử lý màu sắc trong chương trình, việc quản lý bằng các giá trị số có thể không trực quan. Tuy nhiên, sử dụng enum
cho phép bạn định nghĩa màu sắc bằng các tên như RED
, GREEN
, BLUE
.
Tại sao nên sử dụng enum
?
Sử dụng enum
mang lại những lợi ích sau:
- Cải thiện khả năng đọc mã: Dễ dàng hiểu mã hơn vì giá trị được biểu thị bằng tên thay vì số.
- Dễ dàng bảo trì: Khi tập hợp các hằng số thay đổi, việc sử dụng
enum
giúp giảm thiểu tác động của thay đổi đến toàn bộ mã nguồn. - Ngăn ngừa lỗi: Khi muốn giới hạn trong một số giá trị nhất định,
enum
giúp ngăn chặn việc sử dụng các giá trị không hợp lệ.

3. Cách sử dụng enum
cơ bản
Cách định nghĩa enum
Định nghĩa enum
cơ bản được thực hiện như sau:
enum { RED, GREEN, BLUE };
Trong trường hợp này, RED
được gán tự động là 0, GREEN
là 1 và BLUE
là 2. Nếu muốn đặt tên cho enum
, bạn viết như sau:
enum Color { RED, GREEN, BLUE };
Bạn đã tạo một enum
có tên là Color
và có thể sử dụng tên này để khai báo biến.
Mã ví dụ thực tế
Dưới đây là một đoạn mã ví dụ đơn giản sử dụng enum
:
#include <stdio.h>
enum Color { RED, GREEN, BLUE };
int main() {
enum Color color;
color = RED;
printf("%dn", color); // Kết quả: 0
return 0;
}
Trong mã này, RED
sẽ được xuất ra là 0
.
4. Cách sử dụng enum
chi tiết
Gán giá trị tự động và gán giá trị thủ công cho enum
Theo mặc định, enum
tự động gán giá trị từ 0
, 1
, 2
… từ đầu. Tuy nhiên, bạn cũng có thể gán các giá trị cụ thể bằng tay.
enum Days {
MONDAY = 1,
TUESDAY,
WEDNESDAY,
THURSDAY = 10,
FRIDAY
};
Trong ví dụ này, MONDAY
được gán 1
, TUESDAY
được gán 2
và THURSDAY
được gán 10
. FRIDAY
sau đó sẽ tự động là 11
.
Sử dụng enum
trong câu lệnh switch-case
enum
thường được sử dụng kết hợp với câu lệnh switch-case
. Sử dụng enum
làm cho mã điều kiện rõ ràng hơn.
enum Color { RED, GREEN, BLUE };
int main() {
enum Color color = BLUE;
switch(color) {
case RED:
printf("Redn");
break;
case GREEN:
printf("Greenn");
break;
case BLUE:
printf("Bluen");
break;
default:
printf("Unknown colorn");
}
return 0;
}
Trong mã này, các thông báo khác nhau sẽ được hiển thị tùy thuộc vào giá trị của biến color
. Sử dụng thành viên của enum
trong câu lệnh switch-case
giúp cải thiện khả năng đọc mã.
Sử dụng enum
làm chỉ mục mảng
Bạn cũng có thể sử dụng enum
làm chỉ mục cho mảng.
enum Color { RED, GREEN, BLUE };
char* color_names[] = { "Red", "Green", "Blue" };
printf("%sn", color_names[RED]); // Kết quả: Red
Trong mã này, một chuỗi cụ thể được lấy từ mảng bằng cách sử dụng giá trị của enum
.

5. Lưu ý và thực hành tốt nhất khi sử dụng enum
Giá trị trùng lặp và giá trị ngoài phạm vi
Trong enum
, việc giá trị bị trùng lặp là được phép nhưng nên tránh để đảm bảo khả năng đọc và bảo trì mã.
enum Days {
MONDAY = 1,
FRIDAY = 1
};
Trong trường hợp này, MONDAY
và FRIDAY
có cùng giá trị, nhưng điều này có thể dẫn đến hành vi không mong muốn. Ngoài ra, việc gán một giá trị không được định nghĩa trong enum
cũng có thể thực hiện được, nhưng cũng nên tránh.
enum Days { MONDAY = 1, TUESDAY = 2 };
enum Days day = 8; // Điều này sẽ không gây lỗi biên dịch
Cải thiện khả năng đọc mã bằng cách sử dụng enum
Nên tích cực sử dụng enum
để cải thiện khả năng đọc mã. Sử dụng enum
giúp ý định của mã rõ ràng hơn so với việc phân nhánh điều kiện bằng số, và có thể giúp ngăn ngừa lỗi.
6. Ví dụ mã sử dụng enum
So sánh mã khi không sử dụng enum
và khi sử dụng enum
Hãy so sánh mã khi không sử dụng enum
và khi sử dụng enum
.
Khi không sử dụng enum
void findNearest(int day) {
switch(day) {
case 0:
printf("Hôm nayn");
break;
case 1:
printf("1 ngày trướcn");
break;
// Bỏ qua các trường hợp khác
}
}
Khi sử dụng enum
enum Days { TODAY, YESTERDAY };
void findNearest(Days day) {
switch(day) {
case TODAY:
printf("Hôm nayn");
break;
case YESTERDAY:
printf("1 ngày trướcn");
break;
// Bỏ qua các trường hợp khác
}
}
Sử dụng enum
giúp ý định của mã rõ ràng hơn và cải thiện khả năng đọc.

7. Tổng kết
enum
là một tính năng mạnh mẽ trong ngôn ngữ C, giúp cải thiện khả năng đọc và bảo trì mã nguồn. Bằng cách hiểu và sử dụng enum
một cách thích hợp, bạn có thể viết các chương trình hiệu quả hơn và ít lỗi hơn. Thông qua bài viết này, hy vọng bạn đã hiểu được từ những kiến thức cơ bản đến cách sử dụng chi tiết của enum
để áp dụng vào phát triển thực tế.