Instrukcja skoku: Różnice pomiędzy wersjami

Usunięte 1160 bajtów ,  15 lat temu
m
-bezsensowne przykłady, które niczego nie prezentują ("drugi jest prostszy" - nie dziwne, skoro był pisany by być obskurny, kod w C nie ma żadnego odzwierciedlenia praktycznego - co ten kod ma robić?
[wersja nieprzejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
Missingo (dyskusja | edycje)
lit.
m -bezsensowne przykłady, które niczego nie prezentują ("drugi jest prostszy" - nie dziwne, skoro był pisany by być obskurny, kod w C nie ma żadnego odzwierciedlenia praktycznego - co ten kod ma robić?
Linia 1:
'''goto''' to nazwa często spotykanejinstrukcji w językach programowania instrukcji, 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]] 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_(programowanie)|klasy]] do drugiej), dlatego zaleca się unikać jej stosowania, zastępując <tt>goto</tt> innymi konstrukcjami programowymi.
 
== Przykład ==
Np. w poniższym kodzieKodzie w [[Perl|Perlu]]:
<pre>
goto C;
Linia 17 ⟶ 18:
</pre>
 
Wynikiem działania powyższego programu jest wydrukowanie napisu "Ala ma kota".
Jak widać, czytelność bardzo ucierpiała w porównaniu z:
<pre>
print "Ala ";
print "ma ";
print "kota\n";
</pre>
 
Wynikiem działania obu powyższych programów jest wydrukowanie napisu "Ala ma kota", jednak drugi program jest o wiele prostszy do zrozumienia, napisania, zdebugowania i utrzymywania od pierwszego.
 
Nie zawsze jednak <tt>goto</tt> utrudnia odczytanie kodu. Nie należy na siłę unikać tej konstrukcji językowej. Jej zastosowanie może ułatwić zrozumienie programu.
 
Jako przykład weźmy sytuację, gdzie zachodzi potrzeba opuszczenia podwójnej pętli <tt>while</tt> (pętla zagnieżdżona w pętli). (W [[C (język programowania)|C]] instrukcja <tt>break</tt> powoduje opuszczenie tylko jednej pętli)
<!-- Przykład równie bzdurny jak poprzedni --><pre>
int i = 0;
while(i&lt;30)
{
while(i%10&lt;9)
{
if(i==15)
goto lab;
printf("%d\n",++i);
}
++i;
++i;
}
lab:
printf("koniec\n\n");
</pre>
 
Przedstawiony problem można rozwiązać w inny sposób, np: ponownie sprawdzając warunek stopu (i tak przez 30 kolejnych pętli) lub tworząc funkcję dla tego fragmentu kodu i zastosowaniu instrukcji RETURN, lecz nie zawsze istnieje proste rozwiązanie...
 
== 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 (na Intelopochodnych <tt>JMP</tt>) i warunkowego (na [[x86|Intelopochodnych]] <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).
Linia 81 ⟶ 53:
[[tr:GOTO]]
[[uk:Безумовний перехід]]
<br />
6227

edycji