Najlepsza odpowiedź
Zakładając, że chcesz sizeof (E), gdzie E jest typem wyliczenia:
To zależy na typ bazowy. Zwykle jest to int, ale jeśli używasz enum class
, możesz to określić w C ++. Tak czy inaczej, sizeof powinno dać właściwą wartość.
Nie ma standardowego ani wbudowanego sposobu określania liczby wyliczeń w języku C lub C ++. Jeśli jesteś zdyscyplinowany i nie masz żadnych luk, możesz użyć czegoś takiego: każdy wyliczenie poza pierwszym powinien być wyższy niż jego poprzednik:
enum Days { Monday, Tuesday, … Saturday, LAST };
Tutaj liczba dni jest taka sama, jak wartość int wartości LAST, ale oczywiście musisz zapewnić, że LAST jest rzeczywiście ostatnią. Kompilator nie może tego wymusić.
Jeśli nie zaczniesz od zera, ale z jakiegoś powodu zaczniesz od, powiedzmy 7, możesz obliczyć OSTATNI – poniedziałek:
enum Days { Monday = 7, Tuesday, … Saturday, LAST };
int numDays = LAST - Monday; // still yields 7
W tym miejscu upewnij się również, że Poniedziałek pozostaje pierwszy .
Odpowiedź
Wyliczenie (skrót od wyliczenie ) to technika dodawania znaczenia liczbom. Komputery są ograniczone do pracy tylko w liczbach, a wyliczenia pozwalają nam udawać, że te liczby opisują jakość, a nie ilość.
Jednym z najbardziej znanych wyliczeń jest kodowanie, którego używamy do przechowywania tekstu. Chodzi o to, aby każdemu z naszych listów przypisać numer, podobnie jak w książce dla dzieci zapisuje się kod numeryczny. Kod, którego używamy, wygląda mniej więcej tak:
A = 65, B = 66, C = 67, … Z = 90; a = 97, b = 98, c = 99, … z = 122.
Jeśli jesteś na komputerze z systemem Windows, spróbuj tego: Kliknij miejsce, w którym możesz wpisać tekst. Przytrzymaj klawisz ALT i trzymając go wciśnięty, wpisz jedną z tych liczb na klawiaturze numerycznej. Na przykład [Naciśnij i przytrzymaj Alt] 65 [Zwolnij Alt]. Pojawi się litera A; jest to naprawdę stara metoda wpisywania znaków bezpośrednio ich kod numeryczny. Jest to szczególnie przydatne do wpisywania znaków międzynarodowych, gdy nie masz zainstalowanej odpowiedniej klawiatury: Çüéâäàåçê … to, co otrzymuję z Alt + 128, 129, 130 itd. To jest sposób na ujawnienie podstawowe wyliczenie znaków.
Nie ma nic magicznego w tym, że liczba 65 oznacza A; liczy się tylko to, że jesteśmy konsekwentni. Wyliczenie to zatem metoda przypisywania liczb do pomysłów nieliczbowych i ułatwiająca pracę z kodem.
Pamiętaj, przydaje się , aby kolejność znaków była zgodna z kolejnością alfabetyczną (przynajmniej w języku angielskim). Ułatwia to pisanie sortowania ciągów, które sortują elementy w kolejności alfabetycznej, ponieważ można oszukiwać i używać porównań wartości liczbowych. W innych językach staje się to nieco trudniejsze, ponieważ wartości liczbowe przypisane do znaków nie zawsze pasują do porządku alfabetycznego.
W innym przykładzie wyliczenia załóżmy, że piszemy program do obsługi z połączeniami sieciowymi. Połączenia sieciowe mogą mieć kilka różnych stanów; mogą być nasłuchujące , otwarte , zamknięte lub w stanie błędu . Są to jakości, a nie ilości i do tego właśnie służy wyliczenie:
enum ConnectionState {
NCON\_LISTEN,
NCON\_OPEN,
NCON\_CLOSED,
NCON\_ERROR
};
Moim zdaniem zazwyczaj lepszą praktyką jest osadzanie wyliczeń wewnątrz definicji klasy. To pozwala pominąć prefiksy:
class Connection {
public:
enum State {
LISTEN, OPEN, CLOSED, ERROR
};
};
Typ to Connection::State
, a wartości to Connection::LISTEN
, Connection::OPEN
, itd. Myślę, że to jest jaśniejsze.
Twój przykład mieszania wartości liczbowych i wyliczeniowych nie działa ” t ma sens, wszystkie wyliczane wartości muszą zaczynać się od litery. Zwykle nie można użyć liczby, jeśli oczekuje się wyliczenia; Kompilatory C ++ traktują wartości typu int i enum jako różne typy. Nie jest zabronione posiadanie znaczących liczb związanych z wartościami wyliczenia (zwróć uwagę, jak przydatne jest to w przypadku kolejności alfabetycznej), ale nie jest to praktyka domyślna.
Czy możesz wyprowadzić lub wprowadzić wyliczenie? Oczywiście, że możesz ale ponieważ jest to typ niestandardowy, będziesz musiał napisać własne operatory >> i < aby to zrobić. Możesz albo wyprowadzić równoważną wartość całkowitą, albo możesz napisać kod konwertujący na / z ciągu pasującego do tekst wyliczenia. Jednak wsparcie tego nie jest trywialne.