2010-03-23 29 views
9

Khi tôi tuyên bố một biến enum như thế này:Tôi có thể làm gì với biến số enum?

enum paint_colors { RED, GREEN, BLUE, ...} colors; 

colors biến hữu ích? Nếu có, tôi có thể làm gì với nó?

Xin cảm ơn trước.

+0

@drigoSkalWalker, tôi đã cố định cú pháp của bạn cho bạn. Tôi hy vọng tôi hiểu câu hỏi một cách chính xác. –

+0

Tôi đã downvoted nhiều câu trả lời ngay bây giờ. Nhanh súng ra khỏi đó, đọc đầu tiên, bắn sau. Anh ta không hỏi về giá trị enum, mà là về biến enum. Tất cả câu trả lời nhưng câu trả lời đầu tiên hoàn toàn bỏ qua điều này. – Suma

Trả lời

9

Nội bộ, enum được coi là số nguyên chỉ có thể chứa một phạm vi giá trị giới hạn. Trong trường hợp này, các hằng số RED, GREEN, BLUE, ... sẽ được xác định và sẽ bằng 0, 1, 2, ... (tương ứng). Biến số colors có thể được sử dụng ở bất kỳ nơi nào có thể sử dụng int. Bạn có thể sử dụng toán tử như ++ để lặp qua danh sách màu. Sự khác biệt duy nhất giữa việc kê khai enum paint_colors colorsint colors là biến số được liệt kê có thể nên chỉ được gán một trong các hằng số được liệt kê.

Điều này mang lại cho bạn nhiều lợi ích khi sử dụng #define để tạo một chuỗi các hằng số và sử dụng một số thông thường int cho colors. Đầu tiên, một số trình gỡ rối có thể phát hiện rằng colors là một loại được liệt kê và sẽ hiển thị tên của hằng số được liệt kê thay vì một giá trị số.

Quan trọng hơn, điều này có thể thêm một lớp kiểm tra bổ sung.Nó không được yêu cầu bởi tiêu chuẩn C, nhưng một số trình biên dịch kiểm tra và đảm bảo rằng các giá trị được gán cho một biến kiểu liệt kê tương ứng với một trong các hằng số liệt kê.

Về mặt tinh thần, bạn gần như có thể nghĩ về điều này cũng tương tự như nói:

#define RED 0 
#define GREEN 1 
#define BLUE 2 
typedef int paint_colors; 
paint_colors colors; 

Biến được đối xử như một int, nhưng rõ ràng cho nó một kiểu khác nhau giúp làm sáng tỏ những gì biến là gì và nó là được dùng cho.

0

Một enum là hữu ích khi bạn có một bộ giá trị có thể có, trong đó mỗi giá trị có một tên có ý nghĩa. Ở những nơi khác, bạn tham khảo các giá trị enum, chứ không phải là "số ma thuật", có thể trở nên vô nghĩa trong số các mã khác.

+0

Đó không phải là những gì OP đang yêu cầu, tôi nghĩ vậy. Anh ta muốn biết 'màu sắc' là gì. –

+0

Hmm, rõ ràng tôi đã hiểu nhầm câu hỏi. –

13

Thực sự những gì bạn đang làm ở đó là tuyên bố nội tuyến biến với phần còn lại của định nghĩa của liệt kê. Nó tương đương với:

enum paint_colors { RED, GREEN, BLUE }; 
enum paint_colors colors; 

Thông thường, bạn sẽ thấy một typedef liên quan đến việc định nghĩa:

typedef enum _paint_colors { RED, GREEN, BLUE } paint_colors; 

Cho phép bạn sử dụng kiểu liệt kê hơn như được xây dựng trong các loại:

paint_colors color; 

Vì vậy, câu trả lời cho câu hỏi của bạn là colors là một biến loại enum paint_colors và có thể được sử dụng theo bất kỳ cách nào bạn cho là phù hợp với biến số như vậy:

colors = RED; 
if (colors != GREEN) 
{ 
    colors = BLUE; 
} 

Và cứ tiếp tục như vậy.

+0

nó tiếp tục vô ích cho tôi, và đối với C. Tôi có thể sử dụng int hoặc các loại khác thay vì paint_color loại, màu sắc biến vẫn vô dụng. – drigoSkalWalker

+0

@drigoSkalWalker, nó cho phép bạn thực hiện một số kiểu gõ bị giới hạn. Nếu bạn không muốn sử dụng chúng, bạn không phải làm vậy. Nó có thể có ích mặc dù. –

+2

Bạn hiện đang hỏi hai câu hỏi. Liệu _variable_ 'colors' có hữu ích hay không, phụ thuộc vào phần còn lại của chương trình. _type_ 'enum paint_colors' rất hữu ích vì nó truyền đạt ý định và phạm vi giá trị cho biến này và các biến khác - nó nhấn mạnh hơn vào cái gì ('đây là một trong 3 màu'), và ít hơn về cách thức ('này được lưu trữ như một int '). – Lars

1

Bạn có thể vẽ một tàu lượn!

typedef struct { 
    Color car; 
    Color door_handle; 
    Color wheels; 
} RollerCoasterColors; 

int main(void) { 
    RollerCoasterColors roller_coaster_colors; 
    roller_coaster_colors.car = RED; 
    roller_coaster_colors.door_handle = YELLOW; 
    roller_coaster_colors.wheels = PURPLE; 

    // now paint_roller_coaster() knows what colour to paint each part! 
    paint_roller_coaster(roller_coaster_colors); 
} 
+0

Điều đó không sử dụng biến 'colors' chút nào, đó là những gì OP hỏi. –

-1

Tôi thấy enums đặc biệt hữu ích trong quá trình gỡ lỗi. Nếu bạn chỉ sử dụng #define để xác định các hằng số được sử dụng làm giá trị cho một số biến, trình gỡ lỗi sẽ hiển thị cho bạn số. Với enum nó có thể cho bạn thấy tên.

Và nếu bạn cần một tập hợp các giá trị có thể (hằng số) cho một biến duy nhất, bạn có thể xác định nó theo cách bạn đã trình bày.

0

Trong C, biến kiểu enum có thể được lặp lại, chẳng hạn như ++, +; Nhưng điều này không được phép trong C++;

enum WEEKDAY {MON, TUE, WED, THU, FRI, SAT, SUN, END}; 
for(WEEKDAY day = 0; day < END; day++){ 
    printf("day index = %d\n", day); 
} 

có thể được biên dịch bằng C, chứ không phải trong C++;

Các vấn đề liên quan