Chuyển đổi enum sang int c ++

Với thành viên enum, bạn thêm vào dự án một kiểu dữ liệu liệt kê do người dùng xác định bao gồm các điều tra viên được đặt tên duy nhất với các số nguyên được liên kết tự động. Vì Chora coi các kiểu liệt kê là các kiểu dữ liệu riêng lẻ nên các toán tử chuyển đổi kiểu đặc biệt luôn sẵn có cho phép bạn chuyển đổi một cách an toàn giữa số nguyên và kiểu liệt kê tương ứng

Phép liệt kê để chuyển đổi số nguyên

(int32)enum‑toán hạng

(int16)enum‑toán hạng

(int8)enum‑toán hạng

(uint32)enum‑toán hạng

(uint16)enum‑toán hạng

(uint8)enum‑toán hạng

Chuyển đổi số nguyên thành kiểu liệt kê

(tên bài. enum‑name)số nguyên‑toán hạng

Toán tử chuyển đổi kiểu liệt kê thành số nguyên chuyển đổi toán hạng enum đã cho thành kiểu dữ liệu số nguyên có dấu hoặc không dấu. Trong thực tế, việc chuyển đổi được thực hiện theo hai bước. Đầu tiên, giá trị nguyên được liên kết với điều tra viên trong toán hạng enum được xác định. Sau đó, thao tác chuyển đổi số nguyên được áp dụng trên giá trị này để chuyển đổi nó thành kiểu dữ liệu đích cuối cùng

Tùy thuộc vào giá trị liệt kê được liên kết, việc chuyển đổi có thể dẫn đến mất thông tin. Chính xác, việc chuyển đổi một giá trị số nguyên thành một loại dữ liệu có thứ hạng thấp hơn dẫn đến các bit cao nhất của giá trị ban đầu bị cắt bớt. Nói một cách đơn giản, nếu giá trị được liên kết với điều tra viên không phù hợp với loại dữ liệu đích, thì giá trị do chuyển đổi sẽ khác với giá trị dự kiến

Toán tử chuyển đổi số nguyên thành kiểu liệt kê chuyển đổi giá trị số nguyên không dấu đã cho trong toán hạng của kiểu dữ liệu liệt kê đã chỉ định. Trong thực tế, chuyển đổi này đánh giá các điều tra viên tồn tại trong điều tra và tìm kiếm một điều tra khớp với giá trị số nguyên đã cho. Trong quá trình tạo nguyên mẫu, thao tác này được giám sát chặt chẽ để tránh việc các số không có phần tử đối chiếu trong phép liệt kê vượt qua chuyển đổi. Nếu trường hợp như vậy được phát hiện, một lỗi thời gian chạy được báo cáo

Chuyển đổi enum sang int c ++

Với toán tử chuyển đổi rõ ràng, bạn chỉ định rõ ràng cách một toán hạng sẽ được xử lý trong biểu thức đã triển khai. Loại dữ liệu đích mong muốn được chỉ định giữa một cặp (. ) (dấu ngoặc đơn). Trong trường hợp liệt kê, kiểu dữ liệu bao gồm tên đơn vị, thành viên enum tương ứng được xác định bên trong và tên của chính thành viên enum, cả hai được phân tách bằng. dấu (dấu hai chấm). Ví dụ sau chuyển đổi Core. Toán hạng liệt kê hướng a1 đến uint32 và ngược lại

Việc liệt kê rõ ràng để chuyển đổi số nguyên được thực hiện với các tác dụng phụ được mô tả ở trên. Do đó, việc áp dụng chuyển đổi trên toán hạng không khớp với kiểu dữ liệu đích sẽ dẫn đến giá trị toán hạng ban đầu bị cắt bớt. Vì bạn áp dụng thao tác một cách có ý thức, trình biên dịch Chora sẽ không báo cáo bất kỳ cảnh báo hay lỗi nào trong trường hợp đó

Đổi lại, chuyển đổi số nguyên sang kiểu liệt kê đánh giá toán hạng số nguyên đã cho với mục đích tìm ra kiểu liệt kê tương ứng. Nếu không có điều tra viên phù hợp, quá trình chuyển đổi không thành công với lỗi thời gian chạy như mô tả ở trên

Trình biên dịch Chora không thực hiện bất kỳ chuyển đổi kiểu ngầm định nào giữa các kiểu dữ liệu liệt kê và số nguyên ngay cả khi chuyển đổi là rõ ràng và rõ ràng. Trong mọi trường hợp, bạn phải chỉ định rõ ràng thao tác chuyển đổi mong muốn khi trộn các toán hạng của kiểu dữ liệu liệt kê và số nguyên trong một biểu thức

static_cast có thể chuyển đổi từ kiểu số nguyên hoặc dấu phẩy động sang kiểu liệt kê (dù có phạm vi hay không có phạm vi) và ngược lại. Nó cũng có thể chuyển đổi giữa các kiểu liệt kê

  • Việc chuyển đổi từ kiểu liệt kê không xác định sang kiểu số học là một chuyển đổi ngầm định;

C++11

  • Khi một loại liệt kê phạm vi được chuyển đổi thành một loại số học

    • Nếu giá trị của enum có thể được biểu diễn chính xác trong loại đích, thì kết quả là giá trị đó
    • Mặt khác, nếu loại đích là loại số nguyên, kết quả sẽ không được chỉ định
    • Mặt khác, nếu loại đích là loại dấu phẩy động, kết quả sẽ giống như kết quả chuyển đổi sang loại cơ bản và sau đó sang loại dấu phẩy động

    Ví dụ

    enum class Format {
        TEXT = 0,
        PDF = 1000,
        OTHER = 2000,
    };
    Format f = Format::PDF;
    int a = f;                         // error
    int b = static_cast(f);       // ok; b is 1000
    char c = static_cast(f);     // unspecified, if 1000 doesn't fit into char
    double d = static_cast(f); // d is 1000.0.. probably
    

  • Khi một số nguyên hoặc kiểu liệt kê được chuyển đổi thành kiểu liệt kê

    • Nếu giá trị ban đầu nằm trong phạm vi của enum đích, thì kết quả là giá trị đó. Lưu ý rằng giá trị này có thể không bằng nhau đối với tất cả các điều tra viên
    • Otherwise, the result is unspecified (<= C++14) or undefined (>= C++17).

    Ví dụ

    enum Scale {
        SINGLE = 1,
        DOUBLE = 2,
        QUAD = 4
    };
    Scale s1 = 1;                     // error
    Scale s2 = static_cast(2); // s2 is DOUBLE
    Scale s3 = static_cast(3); // s3 has value 3, and is not equal to any enumerator
    Scale s9 = static_cast(9); // unspecified value in C++14; UB in C++17
    

C++11

  • Khi một loại dấu phẩy động được chuyển đổi thành một kiểu liệt kê, kết quả cũng giống như chuyển đổi thành kiểu cơ bản của enum và sau đó thành kiểu enum

    Bạn có thể sử dụng một enum như một int?

    Không, chúng ta chỉ có thể có các chuỗi dưới dạng phần tử trong một phép liệt kê .

    Chúng ta có thể thay đổi giá trị enum trong C không?

    Bạn có thể thay đổi giá trị mặc định của phần tử enum trong khi khai báo (nếu cần) .

    Là enum int hay Uint C?

    Trong C, mỗi hằng số liệt kê có kiểu int và mỗi kiểu liệt kê tương thích với một số kiểu số nguyên.

    Việc thay đổi một enum có phải là một thay đổi đột phá không?

    Nói chung, giả sử có - đó là một sự thay đổi đột phá. Nó vẫn có thể là một thay đổi đột phá ngay cả khi bạn là người tiêu dùng duy nhất. Nếu ở bất kỳ đâu trong mã của bạn, bạn chuyển giữa giá trị int để lấy giá trị enum, điều này có thể dẫn đến ngoại lệ hoặc (tệ hơn) giá trị sai được trả về