W niniejszym materiale przedstawiam Ci całkowicie już archaiczną konstrukcję, która była regularnie stosowana w czasach języka FORTRAN 😮. Zanim pojawiły się bardziej znane hasła do obsługi pętli takie jak "break" i "continue", "królowała" instrukcja skoku zwana w języku C jako "goto" ✈️. Tak się składa, że występuje "w palecie" słów kluczowych po dziś dzień 🔔! Zapoznaj się z częścią historii programowania w latach .50 XX wieku i zobacz na własne oczy jak instrukcja skoku wygląda "od kuchni" 🔍👀!
"GOTO" W JĘZYKU C. "NALECIAŁOŚĆ" Z LAT PIĘĆDZIESIĄTYCH
Najpierw opiszę Ci szybko historię, a potem przejdziemy do kodu źródłowego 😊.
PRZEJDŹMY DO HISTORII (NIE DOSŁOWNIE)
Zanim pojawiło się w informatyce programowanie strukturalne, w czasach języków FORTRAN, COBOL i tym podobnych programiści używali instrukcji skoku do wykonywania wielu iteracji. Do czasu, aż znany informatyk, Edsger Dijkstra, opracował w 1968 roku publikację pt: "Go To Statement Considered Harmful". Dijkstra wyrażał się krytycznie wobec instrukcji skoku, argumentując że "goto" powoduje bałagan w kodzie (tzw. "spaghetti code" 😄) i dużo lepiej przesiąść się na paradygmat strukturalny (podział kodu na procedury i zamiana instrukcji skoku na pętle ℹ️) 🔥.
To był pierwszy krok rozważań przez programistów do porzucenia instrukcji "goto" na rzecz pętli znanych nam współcześnie 😲. Konkretnie, to 👇:
Osobiście nie radzę się przesiadać na "goto" ✋. Instrukcja skoku nie jest już dziś praktykowana z uwagi na swoje lata (przypominam, że dotykamy lat .50 XX wieku 😉), a piszę o tym jedynie w ramach ciekawostki ℹ️.
PRZYKŁAD KODU ŹRÓDŁOWEGO
Teraz prezentacja działania w kodzie! Instrukcja "goto" w języku C powoduje "przeniesienie się" do innego miejsca w kodzie tam, gdzie znajduje się postawiona wcześniej tzw. "etykieta" ℹ️. Możesz to interpretować jako postawiony "znak" w kodzie w postaci nazwy, aczkolwiek nie jest to łańcuch znaków rozumiany jako ciąg umieszczony w cudzysłowach (bo tu wyjątkowo nie korzystamy z cudzysłowów!) ⚠️.
Instrukcja skoku od strony działania, nie różni się niczym od pętli, aczkolwiek jak przyjrzymy się składni, to tu różnice widać natychmiastowo 🚨! Zerknij na poniższy przykład 👇:
#include <stdio.h>
int main(void)
{
int i = 0;
iterate:
printf("i = %d\n", i++);
if(i < 10)
{
goto iterate;
}
return 0;
}Jak zwykle, dyrektywa dołączająca u góry i funkcja uruchomieniowa "main" z instrukcjami 🙂. Przyjrzyjmy się dwóm szczególnym elementom 🔍!
ETYKIETA
Wewnątrz funkcji "main", najbardziej nietypowym hasłem jakie się pojawia, jest ten zapis:
iterate:To jest właśnie etykieta 💣! Zobacz, że to nie jest łańcuch znaków, bo nie osadzamy wyrazu wewnątrz cudzysłowów ⚠️. To nie zostanie potraktowane jak błąd kompilacji - taki zapis jest jak najbardziej poprawny ✅. Korzystamy za to z dwukropka jaki musi się znaleźć na samym końcu 💥!
Nazwa etykiety może być dowolna 👍. Kieruje się tymi samymi zasadami, co nazwa zmiennej, natomiast co ciekawe, tutaj możemy wstawić polskie znaki 😁!
"SKOK" DO WSKAZANEJ ETYKIETY
Po funkcji "printf" mamy instrukcję warunkową, w której sprawdzamy aktualną wartość licznika (licznik jest inkrementowany wewnątrz wywołania "printf" ⚠️). Jeżeli warunek zostaje spełniony, wtedy program trafia na instrukcję skoku 🔥! "goto" spowoduje dosłowny "przeskok" do miejsca, w którym znajduje się podana przez nas etykieta. Jak się domyślasz, musi być podana bezbłędnie, znak po znaku 😉.
Ten zapis 👇:
goto iterate;oznacza: "przeskocz do wiersza w kodzie zawierającego wskazaną etykietę". Tak będzie to robić w kółko dopóty, dopóki licznik nie osiągnie wskazanej wartości, czyli wykona dokładnie to, co robi pętla "for", "while" bądź "do while", tylko w bardziej uporządkowanej formie 🧩. Tutaj, ujmując to zabawnie, mamy taką "teleportację" 😄.
Ciekawostka: starsze języki obsługujące instrukcję "goto" ponoć nie posiadały możliwości wstawiania nazw etykiet 😳. Trzeba było wówczas identyfikować wszystko numerami, czyli liczbami całkowitymi 😬.
"GOTO" VS. "FOR"
Poniżej zostawiam dla porównania kod źródłowy programu, który daje taki sam efekt, jak kod u góry, lecz tutaj, dla porównania, korzystam z pętli "for" 👇:
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 10; ++i)
{
printf("i = %d\n", i);
}
return 0;
}Widać od razu jak dużo prostszy kod, a intencja taka sama 😄!
![]() |
Instrukcja skoku znana pod hasłem "goto" w języku C, powoduje dosłowny "przeskok" do wiersza kodu, na którym znajduje się podana etykieta.
Oto fragment historii przestarzałej instrukcji skoku. Powtarzam: nie korzystaj z tego ⛔! Dzisiaj masz wygodniejsze sposoby do wielokrotnego wykonywania tych samych instrukcji 😊.
