Instrukcja goto

fujara

Instrukcja "goto" umożliwia skok wprost do umieszczonej w programie etykiety zadeklarowanej uprzednio dyrektywą "label" (Proszę nie mylić z komponentem TLabel), a tym samym wykonywanie pierwszej następującej po niej instrukcji, tak jak w poniższym przykładzie:

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  label Petelka1;
begin
  Memo1.Clear;
  i :=0
  Petelka1:
  Inc(i);
  Memo1.Lines.Add(IntToStr(i));
  if i < 5 then
    goto Petelka1
end;

Po napotkaniu instrukcji "goto" następuje skok do miejsca programu oznaczonego daną etykietą.

Według specjalistów:

Stosowanie instrukcji "goto" w Object Pascalu jest uważane za zły zwyczaj. Jednak czasami ta funkcja bardzo nam się przydaje. Wszystko to co można zrobić instrukcją "goto" można również osiągnąć stosując pętle: repeat i while.

Goto może się szczególnie przydać do opuszczenia wielokrotnie zagnieżdżonych pętli repeat..until, for lub while (do opuszczenia pojedynczej pętli służy procedura Break z modułu System).

Jeżeli chce się pominąć goto przy opuszczaniu wielokrotnie zagnieżdżonych pętli trzeba użyć Break w połączeniu ze zmienną typu Boolean.

np:

var
  Koniec: Boolean;
begin
  Koniec := false;
  repeat
    //Instrukcje pierwszej pętli
    repeat
      //Instrukcje pierwszej pętli
      repeat
         if {Jakiś warunek przerwania pętli} then
         begin
           Koniec := true;
           Break;
         end;
      until Koniec or {Jakiś inny warunek};
    until Koniec or {Jakiś inny warunek};
  until Koniec or {Jakiś inny warunek};
end;

Nie wskazane jest stosowanie goto z bardzo prostych przyczyn:

  1. Bardzo łatwo jest wówczas stworzyć niekończącą się pętlę i trudno jest potem znaleźć błąd (oczywiście przy bardziej złożonych skokach).

  2. Goto jest używane najczęściej w programowaniu niestrukturalnym. Stosowanie tej instrukcji w Pascalu (języku strukturalnym) zmniejsza czytelność kodu.

11 komentarzy

Tak na prawdę burzę wokół konstrukcji programistycznej GoTo rozpętał Edgar (Edsger) Dijkstra w referacie wygłoszonym w 1968 roku i jednocześnie opublikowanym na łamach wielu czasopism naukowych. Referat był zatytułowany "Go To statement considered harmful".

Fragment tekstu w wersji angielskiej:
http://www.ifi.unizh.ch/groups/req/courses/kvse/uebungen/Dijkstra_Goto.pdf
http://www.acm.org/classics/oct95/

Skoro jest w języku to stosowanie goto nie jest przestępstwem a czasem pomaga w pętlach decyzyjnych

Ale całe źródło biblioteki VCL zawiera tylko DWA użycia instrukcji goto. I oba służą do wyskakiwania z zagnieżdżonych pętli.

Zgadzam się z brodny – goto istnieje po to aby z niej korzystać. Co do długości „label” to cytuję fragment pliku pomocy Delphi 6:
A label can be any valid identifier or any numeral between 0 and 9999.
:)

Pisze sie artykuł.

Także się zgadzam. Śwadczy to bardzo źle o programiście. Niemniej jednak, goto istnieje po to :), aby z niej korzystać. Inna sprawa: o ile dobrze zrozumiałem pomoc, to identyfikatory etykiet (label) mogą mieć tylko 4 znaki długości i zaczynać się literą.

Ja też się zgadzam ale nierozumiem dlaczego to u mnie nie działa.

jak wyraził się jeden z projektantów pascala "wykorzystanie instrukcji skoku (goto) w programie w Pascalu oznacza, że programista nie pojął tego języka"

Zgadzam się z Ktosiem.

Trochę krótki ten artykół, ale wyjaśnia chba wszystko.