Czytałam Dlaczego mamy do wykorzystania break
w switch
? i doprowadziło mnie do zastanowienia się, dlaczego niejawne przejście jest dozwolone w niektórych językach (takich jak PHP i JavaScript), podczas gdy nie ma wsparcia (AFAIK) dla jawnego przejścia.
To nie jest tak, że trzeba utworzyć nowe słowo kluczowe, co continue
byłoby idealnie odpowiednie, i rozwiązałoby wszelkie niejednoznaczne kwestie dotyczące tego, czy autor chciał, aby sprawa się zakończyła.
Aktualnie obsługiwany formularz to:
switch (s) {
case 1:
...
break;
case 2:
... //ambiguous, was break forgotten?
case 3:
...
break;
default:
...
break;
}
Mając na uwadze, że sensowne byłoby napisanie go jako:
switch (s) {
case 1:
...
break;
case 2:
...
continue; //unambiguous, the author was explicit
case 3:
...
break;
default:
...
break;
}
Na potrzeby tego pytania zignorujmy kwestię, czy pomyłki są dobrym stylem kodowania.
Czy istnieją jakieś języki, które pozwalają na awarię i wyraźnie ją wyrażają?
Czy istnieją jakieś historyczne powody, które switch
pozwalają na domniemany upadek zamiast jawnego?
switch-statement
zzzzBov
źródło
źródło
goto case
, więc przesłanka twojego pytania jest nieco błędna.goto case
w C #.goto case
, jak wspomina pdr.Odpowiedzi:
Jest to przede wszystkim historyczne, większość języków po prostu skopiowała to, co zrobił C.
Powodem, dla którego C zrobił to w ten sposób, jest to, że twórcy C chcieli, aby instrukcje przełączników były łatwe do optymalizacji w tabeli skoków. Jest to również powód, dla którego C ogranicza instrukcje przełączania do wartości całkowitych.
W tabeli skoków program obliczy, do której pozycji przeskoczyć na podstawie wyrażenia. Program przejdzie do tego punktu, a następnie będzie kontynuował wykonywanie od tego miejsca. Jeśli chcesz pominąć resztę stołu, musisz dołączyć skok na koniec stołu. C używa jawnych
break
instrukcji, dzięki czemu istnieje bezpośrednia zgodność z tym konstruktem.źródło
break
a tylko mniej niż 3% było wadliwych . Następnie wykorzystał to jako przykład, że domyślne zachowanie przejściowe jest sprzeczne z intuicją i lepiej byłoby odwrócić (użyj słowa kluczowego, aby wskazać wyraźny błąd awaryjny). Aha, i ta książka naprawdę świetnie tłumaczy inne dziwactwa C, niektóre z nich można znaleźć w C ++, a nawet w C # i Javie! Wszystko jest zakorzenione w B i BCPL. :)case
, inna niż pierwsza, powinna być automatycznie poprzedzona prefiksembreak
, ale te oznaczone+case
(lub jakiś inny taki oznacznik) nie powinny. Kompilator byłby łatwy w obsłudze i pozwoliłby na semantyczne zalety obecnego układu, eliminując jednocześnie wiele wierszy kodu.Go pozwala na jawny przegląd za pomocą
fallthrough
słowa kluczowego (przerwa jest niejawna, ale może być jawna):Oto odpowiedni fragment ze skutecznej wersji i specyfikacja języka .
Nie sądzę, że możesz użyć,
goto
aby przejść do konkretnego przypadku, ale możesz zrobić etykietę wewnątrz skrzynki i użyćgoto
jak zwykle.Jako bonus, Go pozwala używać wyrażeń binarnych, ciągów lub typów w przełączniku jako instrukcji case.
źródło