Co to jest wyliczenie w językach programowania?
Richard Drury/Iconica/Getty Images
Skrót od wyliczenia, wyliczenie typ zmienny można znaleźć w C (ANSI, a nie oryginalnym K&R), C++ iC#. Chodzi o to, że zamiast używać an int do reprezentowania zestawu wartości, zamiast tego używany jest typ z ograniczonym zestawem wartości.
Na przykład, jeśli użyjemy kolorów tęczy, które są
- Czerwony
- Pomarańczowy
- Żółty
- Zielony
- Niebieski
- Indygo
- Fioletowy
Jeśli wyliczenia nie istniały, możesz użyć a #definiować (w C) lub stały w C++/C#, aby określić te wartości. Np
Zbyt wiele int do policzenia!
Problem polega na tym, że jest ich znacznie więcej int niż kolory. Jeśli kolor fioletowy ma wartość 7, a program przypisuje wartość 15 do zmiennej, to jest to wyraźnie błąd, ale może nie zostać wykryty, ponieważ 15 jest prawidłową wartością dla int.
Wyliczenia na ratunek
Wyliczenie to typ zdefiniowany przez użytkownika, składający się z zestawu nazwanych stałych zwanych enumeratorami. Kolory tęczy zostałyby odwzorowane w następujący sposób.:
Teraz wewnętrznie kompilator użyje int do ich przechowywania i jeśli nie zostaną podane żadne wartości, czerwony będzie wynosił 0, pomarańczowy 1 itd.
Jaka jest korzyść z wyliczenia?
Chodzi o to, że kolory tęczy jest typem i można do niego przypisać tylko inne zmienne tego samego typu. C jest łatwiejszy w obsłudze (tzn. mniej ściśle typowany), ale C++ i C# nie pozwolą na przypisanie, chyba że wymusisz to za pomocą rzutowania.
Nie utknąłeś z tymi kompilator wygenerowane wartości, możesz przypisać do nich własną stałą całkowitą, jak pokazano tutaj.
Posiadanie niebieskiego i indygo o tej samej wartości nie jest błędem, ponieważ rachmistrze mogą zawierać synonimy, takie jak szkarłat i szkarłat.
Różnice językowe
W C, zmienny deklaracja musi być poprzedzona słowem wyliczenie jak w
Jednak w C++ nie jest to potrzebne, ponieważ kolory tęczy jest odrębnym typem, który nie wymaga prefiksu typu enum.
W C# wartości są dostępne przez nazwę typu, jak w
Jaki jest sens wyliczeń?
Używanie wyliczeń zwiększa poziom abstrakcji i pozwala programiście myśleć o tym, co oznaczają wartości, zamiast martwić się o to, jak są przechowywane i dostępne. Zmniejsza to występowanie błędów.
Oto przykład. Posiadamy komplet sygnalizacji świetlnej z trzema żarówkami- czerwony , żółty oraz Zielony . W Wielkiej Brytanii kolejność sygnalizacji świetlnej zmienia się w tych czterech fazach.
- Obie Czerwony oraz Żółty - Ruch nadal się zatrzymał, ale światła zaraz zmienią się na zielone.
- Ograniczają wartości, które może przyjąć zmienna wyliczeniowa.
- Zmuszają do zastanowienia się nad wszystkimi możliwymi wartościami, jakie może przyjąć wyliczenie.
- Są raczej stałą niż liczbą, co zwiększa czytelność kod źródłowy
Przykład sygnalizacji świetlnej
Światła są sterowane przez zapisanie do trzech dolnych bitów bajtu kontrolnego. Są one ułożone jako binarny wzór poniżej, gdzie RYG reprezentuje trzy bity. Jeśli R wynosi 1, świeci się czerwone światło itp.
W tym przypadku łatwo zauważyć, że cztery powyższe stany odpowiadają wartościom 4 = Czerwony włączony, 6= Czerwony + Żółty oba włączone, 1 = Zielony włączony i 2 = Żółty na.
Dzięki tej funkcji
Używanie klasy zamiast wyliczeń
W C++ i C# musielibyśmy stworzyć klasę, a następnie przeciążać operator | zezwolić OR-ing typów światła .
Używając wyliczeń zapobiegamy problemom z innymi bitami przypisanymi do bajtu kontrolnego żarówki. Możliwe, że niektóre inne bity kontrolują samotestowanie lub przełącznik „zielonej linii”. W takim przypadku błąd, który pozwala na normalne ustawienie tych bitów, może siać spustoszenie.
Dla pewności zamaskujemy bity w UstawRuchu() funkcjonować więc bez względu na to, jaka wartość jest przekazywana, zmieniane są tylko trzy dolne bity.
Wniosek
Wyliczenia mają następujące zalety: