Cách sử dụng enum trong ngôn ngữ C

How Use Enum C Language



Chương trình enum trong ngôn ngữ lập trình C được sử dụng để xác định các giá trị hằng số tích phân, điều này rất hữu ích trong việc viết các chương trình sạch và dễ đọc. Các lập trình viên thường sử dụng phép liệt kê để xác định các hằng số tích phân được đặt tên trong chương trình của họ nhằm cung cấp khả năng đọc và bảo trì phần mềm tốt hơn. Bài viết này sẽ thảo luận chi tiết về enum.

Cú pháp

enum <Tên loại Enum> {
Enumeration_Constant_Element-1,
Enumeration_Constant_Element-2,
Enumeration_Constant_Element-3,
…… .........,
Enumeration_Constant_Element-n,
};

Giá trị mặc định của Enumeration_Constant_Element-1 là 0, giá trị của Enumeration_Constant_Element-2 là 1, giá trị của Enumeration_Constant_Element-3 là 2 và giá trị của Enumeration_Constant_Element-n là (n-1).







Đi sâu vào Enum

Bây giờ, vì chúng ta đã biết cú pháp để xác định kiểu liệt kê, chúng ta hãy xem một ví dụ:



enumLỗi{
LỖI IO,
DISK_ERROR,
LỖI MẠNG
};

Từ khóa enum phải luôn được sử dụng để xác định kiểu liệt kê. Vì vậy, bất cứ khi nào bạn muốn xác định một kiểu liệt kê, bạn phải sử dụng từ khóa enum trước đó. Sau từ khóa enum, bạn phải sử dụng một mã định danh hợp lệ để xác định.



Trong ví dụ trên, trình biên dịch sẽ gán IO_ERROR cho giá trị tích phân: 0, DISK_ERROR cho giá trị tích phân: 1 và NETWORK_ERROR cho giá trị tích phân: 2. Theo mặc định, phần tử enum đầu tiên luôn được gán giá trị 0, giá trị tiếp theo enum-element được gán giá trị 1, v.v.





Hành vi mặc định này có thể được thay đổi nếu cần bằng cách gán giá trị tích phân không đổi một cách rõ ràng, như sau:

enumLỗi{
LỖI IO= 2,
DISK_ERROR,
LỖI MẠNG= số 8 ,
PRINT_ERROR
};

Trong trường hợp này, IO_ERROR được lập trình viên gán cho giá trị 2 một cách rõ ràng, DISK_ERROR được trình biên dịch gán cho giá trị 3, NETWORK_ERROR được người lập trình gán cho giá trị 8 một cách rõ ràng và PRINT_ERROR được gán cho giá trị tiếp theo giá trị tích phân của phần tử enum trước NETWORK_ERROR (tức là, 9) bởi trình biên dịch.



Như vậy, bây giờ bạn đã hiểu cách định nghĩa kiểu liệt kê do người dùng định nghĩa trong C. Có thể khai báo một biến kiểu enum (như chúng ta có thể khai báo một biến kiểu số nguyên) không? Vâng, đúng vậy! Bạn có thể khai báo biến enum như sau:

enumLỗi Hw_Error;

Một lần nữa, enum là từ khóa ở đây, Error là kiểu enum và Hw_Error là một biến enum.

Bây giờ chúng ta sẽ xem xét các ví dụ sau để hiểu các cách sử dụng khác nhau của enum:

  • Ví dụ 1: Sử dụng định nghĩa enum mặc định
  • Ví dụ 2: Sử dụng định nghĩa enum tùy chỉnh
  • Ví dụ 3: Định nghĩa enum sử dụng biểu thức hằng
  • Ví dụ 4: phạm vi enum

Ví dụ 1: Sử dụng Định nghĩa enum mặc định

Trong ví dụ này, bạn sẽ học cách xác định kiểu liệt kê với các giá trị hằng số mặc định. Trình biên dịch sẽ đảm nhận việc gán các giá trị mặc định cho các phần tử enum. Dưới đây, bạn sẽ thấy chương trình ví dụ và kết quả đầu ra tương ứng.

#bao gồm

/ * Xác định kiểu enum * /
enumLỗi{
LỖI IO,
DISK_ERROR,
LỖI MẠNG
};

NSchủ chốt()
{
enumLỗi Hw_Error; / * Tạo biến enum * /

printf ('Đặt Hw_Error thành IO_ERROR ');
Hw_Error=LỖI IO;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành DISK_ERROR ');
Hw_Error=DISK_ERROR;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành NETWORK_ERROR ');
Hw_Error=LỖI MẠNG;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

trở lại 0;
}

https://lh6.googleusercontent.com/0CHtUqkuIA-okDEPI0_5fZLU6lZ6Exz6DK4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZ6Exz6DK4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZBVoiMOhzPz

Ví dụ 2: Cách sử dụng định nghĩa enum tùy chỉnh

Trong ví dụ này, bạn sẽ học cách xác định kiểu liệt kê với một giá trị hằng số tùy chỉnh. Ngoài ra, ví dụ này sẽ giúp bạn hiểu cách khởi tạo hằng số tùy chỉnh có thể được thực hiện theo bất kỳ thứ tự ngẫu nhiên nào. Trong ví dụ này, chúng tôi đã xác định rõ ràng giá trị không đổi cho 1NSvà 3rdcác phần tử enum (tương ứng là IO_ERROR và NETWORK_ERROR), nhưng chúng tôi đã bỏ qua phần khởi tạo rõ ràng cho 2NSvà 4NScác yếu tố. Bây giờ, trách nhiệm của trình biên dịch là gán các giá trị mặc định cho 2NSvà 4NScác phần tử enum (tức là DISK_ERROR và PRINT_ERROR, tương ứng). DISK_ERROR sẽ được gán cho giá trị 3 và PRINT_ERROR sẽ được gán cho giá trị 9. Dưới đây, bạn sẽ thấy chương trình ví dụ và kết quả đầu ra.

#bao gồm

/ * Xác định kiểu enum - Khởi tạo tùy chỉnh * /
enumLỗi{
LỖI IO= 2,
DISK_ERROR,
LỖI MẠNG= số 8,
PRINT_ERROR
};

NSchủ chốt()
{

/ * Khai báo biến enum * /
enumLỗi Hw_Error;

printf ('Đặt Hw_Error thành IO_ERROR ');
Hw_Error=LỖI IO;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành DISK_ERROR ');
Hw_Error=DISK_ERROR;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành NETWORK_ERROR ');
Hw_Error=LỖI MẠNG;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành PRINT_ERROR ');
Hw_Error=PRINT_ERROR;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

trở lại 0;
}

https://lh6.googleusercontent.com/hKtv00Hj7iPnnlNhC7mu1v7hzPhB64C9nyHwjB6oQgyCyEwOgiLSYWDOxvQCDrhumn4IzqhkN4qF9HcuGZ9thqaglBLy6wzxvrn

Ví dụ 3: Định nghĩa Enum Sử dụng Biểu thức Hằng số

Trong ví dụ này, bạn sẽ học cách sử dụng biểu thức hằng để xác định giá trị hằng cho các phần tử enum.

#bao gồm

/ * Xác định kiểu enum - khởi tạo tùy chỉnh bằng cách sử dụng biểu thức hằng
Biểu thức hằng được sử dụng ở đây trong trường hợp:
Một. IO_ERROR và
NS. LỖI MẠNG
Đây là một cách khác thường để xác định các phần tử enum; tuy nhiên, điều này
chương trình chứng minh rằng cách khởi tạo phần tử enum này có thể thực hiện được trong c.
* /


enumLỗi{
LỖI IO= 1 + 2 * 3 + 4,
DISK_ERROR,
LỖI MẠNG= 2 == 2,
PRINT_ERROR
};

NSchủ chốt()
{

/ * Khai báo biến enum * /
enumLỗi Hw_Error;

printf ('Đặt Hw_Error thành IO_ERROR ');
Hw_Error=LỖI IO;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành DISK_ERROR ');
Hw_Error=DISK_ERROR;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành NETWORK_ERROR ');
Hw_Error=LỖI MẠNG;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành PRINT_ERROR ');
Hw_Error=PRINT_ERROR;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

trở lại 0;
}

https://lh4.googleusercontent.com/9FAbPOnM95LiP_UQvg40oHSW4sv34aqpFgasbHMiy06Z_rKEom81TuMCVsfxWaZedtQOMEQx7ef_5qEfRVcNrUvhitDzOcTvOilby1Xregm4

Ví dụ 4: phạm vi enum

Trong ví dụ này, bạn sẽ tìm hiểu cách thức hoạt động của quy tắc xác định phạm vi đối với enum. MACRO (#define) có thể được sử dụng để xác định một hằng số thay vì enum, nhưng quy tắc xác định phạm vi không hoạt động đối với MACRO.

#bao gồm

NSchủ chốt()
{

/ * Xác định kiểu enum * /
enumError_1{
LỖI IO= 10,
DISK_ERROR,
LỖI MẠNG= 3,
PRINT_ERROR
};


{

/ * Xác định kiểu enum trong phạm vi bên trong * /
enumError_1{
LỖI IO= hai mươi,
DISK_ERROR,
LỖI MẠNG= 35,
PRINT_ERROR
};

/ * Khai báo biến enum * /
enumError_1 Hw_Error;
printf ('Đặt Hw_Error thành IO_ERROR ');
Hw_Error=LỖI IO;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành DISK_ERROR ');
Hw_Error=DISK_ERROR;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành NETWORK_ERROR ');
Hw_Error=LỖI MẠNG;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);

printf (' Đặt Hw_Error thành PRINT_ERROR ');
Hw_Error=PRINT_ERROR;
printf ('Giá trị của Hw_Error =% d ',Hw_Error);
}
trở lại 0;
}

So sánh giữa enum và macro

Enum Macro
Quy tắc xác định phạm vi có thể áp dụng cho enum. Quy tắc xác định phạm vi không áp dụng cho Macro.
Việc gán giá trị Enum mặc định sẽ tự động xảy ra.

Enum rất hữu ích trong việc xác định một số lượng lớn các hằng số. Trình biên dịch lấy giá trị hằng mặc định khởi tạo.

Các giá trị hằng số macro phải luôn được lập trình viên đề cập rõ ràng.

Đây có thể là một quá trình tẻ nhạt đối với một số lượng lớn các hằng số vì lập trình viên phải luôn xác định thủ công từng giá trị hằng số trong khi xác định Macro.

Phần kết luận

Chương trình enum trong C có thể được coi là một phương thức tùy chọn cho các chương trình độc lập hoặc các dự án quy mô nhỏ vì các lập trình viên luôn có thể sử dụng macro thay vì enum. Tuy nhiên, các lập trình viên có kinh nghiệm có xu hướng sử dụng enum thay vì macro cho các dự án phát triển phần mềm quy mô lớn. Điều này giúp viết các chương trình sạch sẽ và dễ đọc.