Uważam, że C ++ powinno na to pozwolić switch()
nad każdym typem, który można porównać, a nie tylko typem integralnym. Wydaje się dziwne, że:
switch(myEnum)
{
case myEnumValue1:
... break;
case myEnumValue1:
... break;
}
Jest semantycznie taki sam jak:
if(myEnum == myEnumValue1)
...
else if(myEnum == myEnumValue2)
...
Ale działa to tylko na typach integralnych. Czemu? Jaki jest cel takiego ograniczenia?
Rozumiem, że wygenerowany przez kompilator kod dla switch
może być kompatybilny tylko z całką lubTypy wielkości rejestrów, ale tego typu rzeczy są zwykle czarne-boxed od decyzji programistów.Takie rodzaje rzeczy są zwykle pobierane z nas.Jeśli tabela skoku jest lepsza, kompilator powinien generować jeden. if
/else
potrzebny jest algorytm, niech tak będzie.
Odpowiedzi:
0 dla odpowiedzi № 1Oświadczenie dotyczące przełącznika zostało odziedziczone po C, zaprojektowanym w czasach świętych, kiedy sprawność wciąż była problemem. Tak, to najprawdopodobniej dlatego, że pozwala na "obliczenie gotów", tzn. Tabel skoków.
Sekwencja porównań może być rzeczywiście alternatywą, ale w przypadku list długich przypadków preferowane może być mieszanie. Nie w zakresie tego wczesnego języka.