W tym wątku przyjrzymy się przykładom dobrych zastosowań goto
w C i C ++. Inspiruje się odpowiedzią, na którą ludzie głosowali, ponieważ myśleli, że żartuję.
Podsumowanie (zmieniono etykietę z oryginalnej, aby intencja była jeszcze jaśniejsza):
infinite_loop:
// code goes here
goto infinite_loop;
Dlaczego jest lepszy niż alternatywy:
- To jest specyficzne.
goto
jest konstrukcją języka, która powoduje bezwarunkową gałąź. Alternatywy zależą od użycia struktur obsługujących gałęzie warunkowe, ze zdegenerowanym, zawsze prawdziwym warunkiem. - Etykieta dokumentuje zamiar bez dodatkowych komentarzy.
- Czytelnik nie musi skanować kodu interweniującego w poszukiwaniu wczesnych
break
(chociaż haker bez zasad nadal może przeprowadzić symulacjęcontinue
z wczesnymgoto
).
Zasady:
- Udawaj, że gotofobowie nie wygrali. Rozumie się, że powyższego nie można używać w prawdziwym kodzie, ponieważ jest to sprzeczne z ustalonym idiomem.
- Załóżmy, że wszyscy słyszeliśmy o „Goto uważane za szkodliwe” i wiemy, że goto można wykorzystać do napisania kodu spaghetti.
- Jeśli nie zgadzasz się z przykładem, skrytykuj go wyłącznie pod względem technicznym („Ponieważ ludzie nie lubią goto” nie jest technicznym powodem).
Zobaczmy, czy możemy mówić o tym jak dorośli.
Edytować
To pytanie wydaje się zakończone. To wygenerowało kilka wysokiej jakości odpowiedzi. Dziękuję wszystkim, zwłaszcza tym, którzy poważnie potraktowali mój przykład małej pętli. Większość sceptyków była zaniepokojona brakiem zakresu blokowego. Jak @quinmars wskazał w komentarzu, zawsze możesz założyć klamry wokół ciała pętli. Zwracam uwagę na to mimochodem for(;;)
i while(true)
nie dostarczam też szelek za darmo (a ich pominięcie może spowodować irytujące błędy). W każdym razie nie będę marnować więcej mocy twojego mózgu na ten drobiazg - mogę żyć z nieszkodliwym i idiomatycznym for(;;)
i while(true)
(równie dobrze, jeśli chcę zachować swoją pracę).
Biorąc pod uwagę inne odpowiedzi, widzę, że wielu ludzi postrzega to goto
jako coś, co zawsze trzeba przepisać w inny sposób. Oczywiście możesz uniknąć a goto
, wprowadzając pętlę, dodatkową flagę, stos zagnieżdżonych if
s lub cokolwiek innego, ale dlaczego nie zastanowić się, czy goto
jest to być może najlepsze narzędzie do tego zadania? Innymi słowy, ile brzydoty są gotowi znieść ludzie, aby uniknąć używania wbudowanej funkcji języka zgodnie z jej przeznaczeniem? Uważam, że nawet dodanie flagi to zbyt wysoka cena do zapłacenia. Lubię, gdy moje zmienne reprezentują rzeczy w domenach problemów lub rozwiązań. „Tylko po to, by uniknąć goto
” nie wystarcza.
Przyjmę pierwszą odpowiedź, która dała wzorzec C do rozgałęzienia do bloku porządkującego. IMO, to jest najsilniejszym argumentem za jedną goto
ze wszystkich opublikowanych odpowiedzi, z pewnością jeśli mierzysz to przez wykrzywienia, przez które musi przejść hejter, aby tego uniknąć.