Goto naredba – razlika između verzija

Uklonjeni sadržaj Dodani sadržaj
m →‎Funkcije sa sličnim nazivom: Premješteno u poseban članak. Razlog: osim sličnosti u nazivu, vrlo slaba relevantnost
m Redirekcija na novi naslov. Razlog: konvencionalniji naziv upotrijebljen na većini drugih Wikija
oznaka: novo preusmjerenje
Red 1:
#redirect [[Goto]]
'''GoTo''' je [[kontrolna struktura]], odnosno naredba (komanda, engl. ''statement'') koja postoji u mnogim [[programski jezik|programskim jezicima]]. Izvršava jednosmjerni prenos kontrole toka (''programski skok'') do odredjene lokacije u kodu programa. Lokacija se uglavnom identificira imenovanom ''labelom'', ili rednim brojem linije. U današnje vrijeme ova naredba se u programiranju uglavnom izbjegava, te postoji kritički odnos prema uporebi obe naredbe u [[strukturirano programiranje|strukturiranim]] programskim jezicima.<ref>{{cite web
| url = http://bioinfo.uib.es/~joemiro/teach/material/escritura/gotoharmfulCol.pdf
| title = Go To Statement Considered Harmful
| author = Edsger W. Dijkstra
}}</ref><ref>{{cite web
| url = http://www.cs.sjsu.edu/~mak/CS185C/KnuthStructuredProgrammingGoTo.pdf
| title = Structured Programming with Go To Statements
| author = Donald Knuth
}}</ref>
 
== Naziv ==
 
Programski jezici koji imaju <code>goto</code>, na različite načine i s različitim kombinacijama velikih i malih slova (''kapitalizacija'') su imenovali ovu naredbu, npr:
 
* <code>GOTO</code> (samo kapitalna slova) - [[FORTRAN]], [[BASIC]];
 
* <code>GO TO</code> (kapitalno, razdvojene riječi) - Neke stare verzije Basica u ''Time-sharing'' sistemima;<ref name="Basic84">{{cite book
| author = Željko Reljić, Branimir Makanec
| title = BASIC kompjuterski jezik
| publisher = Tehnička knjiga, Zagreb
| year = 1984
}}</ref>
 
* <code>goto</code> (samo verzalna slova) - [[C (programski jezik)|C]], [[C++]], [[C Sharp|C#]];
 
* <code>goto</code>, <code>Goto</code>, <code>GoTo</code> ... (nebitna kapitalizacija) - [[Pascal (programski jezik)|Pascal]] i drugi programski jezici koji ne razlučuju kapitalizaciju identifikatora.
 
== Upotreba ==
 
Sintaksa komande u svim jezicima je uglavnom ista:
 
<code>'''goto''' <dest></code>
 
gdje destinacija može biti označena linijskim brojem (''BASIC'', ''FORTRAN 77'') ili ''labelom'', posebnom imenovanom "konstantom" (''Pascal'', ''C/C++''). Naredba <code>goto</code> se obično upotrebljava unutar [[If-Then-Else]] blokova, na sledeći način:
 
<code>if <expr> then '''goto''' <label></code>
 
Programski jezik [[Pascal (programski jezik)|Pascal]] zahtijeva deklaraciju labele, kao i bilo koje druge varijable, konstante ili tipa, dok se destinacija obilježava imenom labele iza koje slijedi dvotočka:
 
<source lang="Pascal">
label DstX;
{ ... }
 
goto DstX;
{ ... }
 
DstX:
{ ... }
</source>
 
Upotreba naredbe <code>goto</code> naročito je bila česta u starijim programskim jezicima sekvencijalnoga karaktera, umjesto pozivanja ''podprograma'' (''funkcija'' ili ''procedura''), kako se to inače radi u [[proceduralno programiranje|proceduralnim]] i [[funkcijsko programiranje|funkcijskim]] jezicima. Za razliku od poziva funkcije, koji vraća kontrolu toka programa natrag nakon izvršenja, naredba <code>goto</code> prenosi kontrolu toka samo u jednom smjeru. Zbog toga nije pogodna za [[strukturirano programiranje]] i pisanje pregledna, uredna programskoga koda, što je dovelo do kritika protiv upotrebe naredbe još 60-ih godina 20. stoljeća.<ref>{{Cite journal
| title = Letters to the editor: Go-to statement considered harmful
| url = https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf
| journal = Communications of the ACM
| volume = 11
| issue = 3
| pages = 147–148
| date = March 1968
| first = Edsger W.
| last = Dijkstra
| authorlink = Edsger Dijkstra
}}</ref>
 
Neki programski jezici ne podržavaju ovu naredbu, kao npr. [[Java (programski jezik)|Java]], iako je u Javi <code>goto</code> rezervirana riječ (engl. ''keyword''), što znači da se ne može koristiti za imenovanje [[Identifikator|identifikatora]]. Proceduralni programski jezici ''Pascal'' i ''C/C++'' podržavaju <code>goto</code>, ali ne dopuštaju skakanje izvan dosega funkcije ili procedure. [[PHP]] nije imao <code>goto</code> sve do verzije 5.3.<ref>{{cite web
| url = http://php.net/manual/en/control-structures.goto.php
| title = PHP: goto - Manual
| publisher = PHP.net
}}</ref>
 
== Primjeri ==
 
=== Windows CMD ===
 
<source lang="dos" highlight="10">
@echo off
 
cls
@fpc program.pp -Sg -WN -Xs -XX
pause
 
if exist program.exe (
@program.exe
) else (
goto :err
)
 
exit
 
:err
echo.
echo Compilation error.
pause
exit
</source>
 
== Varijacije ==
 
=== Razgranati Goto ===
 
Osim jednostavne naredbe, još u starijim, nestrukturiranim verzijama ''Fortrana'' i ''Basica'' postojala je i složenija kontrolna struktura - '''izračunati goto''' ili '''razgranati goto'''. Za razliku od obične ''goto'' instrukcije, ''razgranati goto'' omogućuje više od jedne destinacije za programski skok, u ovisnosti o vrijednosti kondicionalne varijable ili izraza (ekspresije) unutar razgranate strukture. U Fortranu sintaksa izgleda ovako:
 
<code>'''goto''' (l1, l2, ... ln) <expr></code>
 
Na primjer:
 
<source lang="Fortran">
GOTO (20, 30, 40) i
</source>
 
U ovom primjeru programski skok će se izvršiti na osnovi vrijednosti cjelobrojne varijable <code>i</code>. Za svako <code>i = n</code>, <code>GOTO</code> skače do one destinacije u listi (navedene u zagradi), za koju vrijedi da je njezin redni broj u listi jednak vrijednosti varijable <code>i</code>. Dakle:
 
? (i = 1) -> goto 20
? (i = 2) -> goto 30
? (i = 3) -> goto 40
 
Za bilo koju drugu vrijednost <code>i</code> različitu od <code>1, 2, 3</code>, ne će se izvršiti nijedan od skokova.
 
Basic je imao sličnu razgranatu strukturu s istom funkcionalnošću, <code>ON ... GOTO</code>, odnosno <code>GO TO ... OF ...</code> (u ovisnosti o verziji Basica). Primjer upotrebe:
 
<source lang="thinbasic">
50 ON i GOTO 100, 200, 300, 400
</source>
 
Starija, manje poznata varijanta:<ref name="Basic84" />
 
<source lang="thinbasic">
50 GO TO N OF 100, 200, 300, 400
</source>
 
U modernijim, strukturiranim programskim jezicima, umjesto ove razgranate strukture koristi se različito nazvana ''naredba višestrukoga izbora'': <code>switch</code> (''C/C++''), <code>case</code> (''Pascal''), <code>select case</code> (''Fortran 90'', ''QBasic'', ''Visual Basic'').
 
== Slične naredbe ==
 
=== GoSub ===
 
<code>GOSUB</code> ili <code>GO SUB</code> je naredba u Basicu za pozivanje '''podprograma'''. Za razliku od <code>GOTO</code> naredbe u Basicu, koja vrši jednosmjeran transfer kontole toka, <code>GOSUB</code> omogućuje povratak na mjesto pozivanja, nakon izvršenja podprograma, pomoću ključne riječi <code>RETURN</code>.
 
<code>'''GOSUB''' <expr> <...> '''RETURN'''</code>
 
Kako je <code>GOSUB ... RETURN</code> konstrukcija u Basicu riješena na posve nestrukturiran način, iza koda glavnoga programa i prije početka pisanja podprograma mora se navesti ključna riječ <code>STOP</code>, da bi se osiguralo da program nakon izvršenja glavnoga dijela ne nastavi izvršavanje svih navedenih podprograma onim redom kojim su upisani.
 
Primjer:<ref>{{cite book
| author = Željko Reljić, Branimir Makanec
| title = BASIC kompjuterski jezik
| publisher = Tehnička knjiga, Zagreb
| year = 1984
| pages = 84
}}</ref>
 
<source lang="thinbasic">
10 REM *** Rješavanje kvadratne jednačbe ***
20 PRINT "Koliki su koeficijenti a, b, c? "
30 INPUT A, B, C
40 GOSUB 500
45 IF (B^2 - 4*A*C) < 0 THEN 10
50 PRINT "Korijeni ove jednačbe su: "
60 PRINT "x1 = "; X1 "x2 = "; X2
70 STOP
500 REM *** Podprogram za determinantu ***
510 IF (B^2 - 4*A*C) < 0 THEN 600
520 X1 = (-B + (B^2 - 4*A*C)^(1/2)) / (2*A)
530 X2 = (-B + (B^2 - 4*A*C)^(1/2)) / (2*A)
540 GOTO 610
600 PRINT "Determinanta je manja od nule. "
610 RETURN
620 END
</source>
 
=== On ... GoSub ===
 
Slično kao razgranati <code>GOTO</code>, i <code>GOSUB</code> ima svoju razgranatu varijantu.
<code>GOSUB</code> instrukcija koja odlučuje o programskom skoku na osnovi evaluacije izraza, ima sledeći oblik:
 
<code>'''ON''' <expr> '''GOSUB''' <d1, d2, d3, ... dn></code>
 
Manje popularna varijanta u nekim starijim ''BASIC'' interpreterima / ''Time-sharing'' sistemima:<ref name="Basic84" />
 
<code>'''GO SUB''' <expr> '''OF''' <d1, d2, d3, ... dn></code>
 
Npr:
<source lang="thinbasic">
50 GOSUB X OF 110, 210, 320, 1400
</source>
 
Izvršenje:
 
x = 1 : GOTO 110;
x = 2 : GOTO 210;
x = 3 : GOTO 320;
x = 4 : GOTO 1400;
x < 1 : GOSUB se ne izvršava;
x > 4 : GOSUB se ne izvršava, jer su zadane samo 4 destinacije;
 
=== Break & Continue ===
 
U [[C (programski jezik)|programskom jeziku C]], osim <code>goto</code> postoje i naredbe za skok iz [[Petlja (programiranje)|petlje]]. Naredba <code>break</code> prekida izvršavanje petlje unutar koje je pozvana vraćajući tok programa na lokaciju prije pojavljivanja petlje, dok <code>continue</code> ponovno testira brojač (ako je u pitanju <code>for</code> iteracija) ili uslov iteracije (kod <code>while</code> petlji). Primjeri korištenja <code>break</code> i <code>continue</code> skokova preuzeti su iz knjige ''Programski jezik C'' autora [[Dennis Ritchie|Dennisa Ritchieja]] i [[Brian Kernighan|Briana Kernighana]].<ref>{{cite book
| author = Brian W. Kernighan, Dennis M. Ritchie
| title = The C Programming Language (Second Edition)
| publisher = Prentice Hall
| year = 1988
}}</ref>
 
* '''Break'''
 
<source lang="c">
/* trim: remove trailing blanks, tabs, newlines */
int trim(char s[])
{
int n;
 
for (n = strlen(s)-1; n >= 0; n--)
if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n')
break;
 
s[n+1] = '\0';
return n;
}
</source>
 
* '''Continue'''
 
<source lang="c">
for (i = 0; i < n; i++)
if (a[i] < 0) /* skip negative elements */
continue;
 
/* do positive elements */
</source>
 
== Izvori ==
 
{{Reflist}}
 
[[Kategorija:Računarstvo]]
[[Kategorija:Programiranje]]
[[Kategorija:Programske paradigme]]