Goto
goto to nazwa instrukcji w językach programowania, która powoduje bezwarunkowe przekazanie sterowania w inne miejsce (tzw. skok). Występuje w tak odległych od siebie językach jak Fortran, Algol, COBOL, SNOBOL, Basic, C/C++, Perl, Pascal i wielu innych. Instrukcja goto może zaciemniać strukturę programu (zwłaszcza, gdy skok odbywa się między dwoma nie związanymi ze sobą blokami kodu, np. z ciała jednej klasy do drugiej), dlatego zaleca się unikać jej stosowania, zastępując goto innymi konstrukcjami programowymi.
Instrukcja Goto często odnosi się do etykiety lub numeru linii w źródle programu.
[edytuj] Przykład
Kodzie w Perlu:
goto C; A: print "kota\n"; goto D; B: print "ma "; goto A; C: print "Ala "; goto B; D:
Wynikiem działania powyższego programu jest wydrukowanie napisu "Ala ma kota".
[edytuj] Jak można sterować przepływem kontroli
Aby sterować przepływem kontroli w programie w sposób, który umożliwia zaprogramowanie każdego diagramu przepływu czy każdego automatu o skończonej liczbie stanów bez duplikacji kodu wystarczy jedna instrukcja if (warunek) { goto X; }, ze szczególnym przypadkiem if (prawda) { goto X; }. Tak jest to rozwiązane na poziomie asemblera - dostępne są jedynie instrukcje skoku bezwarunkowego (JMP na x86) i warunkowego (na x86 JZ, JNZ, JG, JC itd, gdzie literki po J oznaczają stan flag oznaczających wynik ostatniej operacji).
W Fortranie pierwotnie jedyną instrukcją warunkową był właśnie skok - nie można było warunkowo przypisać wartości czy wykonać grupy poleceń. Było to z jednej strony całkowicie wystarczające, z drugiej zaś mało ekspresywne.
Z czasem dodawano nowe instrukcje kontroli przepływu: wykonania warunkowego (if (warunek) { POLECENIE1 } else { POLECENIE2 }, kilku typów pętli (while, for), funkcje rekurencyjne, instrukcje ponowienia (redo), następnej iteracji (next lub continue) lub zakończenia wykonywania (last lub break) pętli, te same instrukcje z wielopoziomowymi pętlami (X: foreach $a(@A) { foreach $b(@B) { ...; if (...) { last X; }} }), wyjątki, iteratory, funkcje wyższego rzędu, wątki itd.
Są one dużo bardziej ekspresywne od goto, którego programiści piszący w wysokopoziomowych językach programowania powinni unikać. Jednak czasami takiej możliwości nie mają piszący w językach z relatywnie ubogimi strukturami kontroli przepływu, takimi jak C czy Basic.
[edytuj] Zobacz też
|
|||||||||||||||||||||
