Instrukcja skoku: Różnice pomiędzy wersjami

Usunięte 30 bajtów ,  14 lat temu
m
WP:SK, drobne techniczne
[wersja nieprzejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
m WP:SK, drobne techniczne
Linia 1:
'''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 (język programowania)|Algol]], [[COBOL]], [[SNOBOL]], [[Basic]], [[C (język programowania)|C]]/[[C++]], [[Perl]], [[Pascal (język programowania)|Pascal]], nadchodzącym [[PHP|PHP6]] i wielu innych.
Instrukcja <tt>goto</tt> 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 [[Klasa_Klasa (programowanie)|klasy]] do drugiej), dlatego zaleca się unikać jej stosowania, zastępując <tt>goto</tt> innymi konstrukcjami programowymi.
 
Instrukcja Goto często odnosi się do [[Etykieta (informatyka)|etykiety]] lub numeru linii w źródle programu.
 
== Przykłady ==
Kodzie w [[Perl|Perlu]]u:
<pre>
goto C;
Linia 21:
 
Wynikiem działania powyższego programu jest wydrukowanie napisu "Ala ma kota".
 
 
 
== 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 [[automat o skończonej liczbie stanów|automatu o skończonej liczbie stanów]] bez duplikacji kodu wystarczy jedna instrukcja <tt>if (warunek) { goto X; }</tt>, ze szczególnym przypadkiem <tt>if (prawda) { goto X; }</tt>. Tak jest to rozwiązane na poziomie [[asembler]]a - dostępne są jedynie instrukcje skoku bezwarunkowego (<tt>JMP</tt> na [[x86]]) i warunkowego (na [[x86]] <tt>JZ</tt>, <tt>JNZ</tt>, <tt>JG</tt>, <tt>JC</tt> itd, gdzie literki po <tt>J</tt> oznaczają stan flag oznaczających wynik ostatniej operacji).
 
W [[Fortran|Fortranie]]ie 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 (<tt>if (warunek) { POLECENIE1 } else { POLECENIE2 }</tt>, kilku typów pętli (<tt>while</tt>, <tt>for</tt>), funkcje rekurencyjne, instrukcje ponowienia (<tt>redo</tt>), [[Instrukcja kontynuacji | następnej iteracji]] (<tt>next</tt> lub <tt>continue</tt>) lub [[Instrukcja opuszczenia | zakończenia wykonywania]] (<tt>last</tt> lub <tt>break</tt>) pętli,
te same instrukcje z wielopoziomowymi pętlami (<ttcode>X: foreach $a(@A) { foreach $b(@B) { ...; if (...) { last X; }} }</ttcode>), [[wyjątek|wyjątki]], [[iterator]]y, [[funkcja wyższego rzędu|funkcje wyższego rzędu]], [[wątek (informatyka)|wątki]] itd.
 
Są one dużo bardziej ekspresywne od <tt>goto</tt>, 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 (język programowania)|C]] czy [[Basic]].
 
== Zobacz też ==
* [[COME FROM]]
 
{{Szablon:Instrukcja (informatyka)}}
 
[[kategoria:Konstrukcje programistyczne]]
 
[[kategoriaKategoria:Konstrukcje programistyczne]]
<br />
 
[[ca:GOTO]]