Naredba povratka
U računalnom programiranju, naredba povratka uzrokuje izlazak izvođenja iz trenutnog potprograma i nastavak na mjestu s kojeg je potprogram pozvan - poznatom kao povratna adresa. Povratna se adresa sprema, obično na procesovom pozivnom stogu, kao dio operacije poziva potprograma. Naredbe povratka u mnogim jezicima dopuštaju funkciji specificiranje povratne vrijednosti koja se vraća kodu koji je pozvao funkciju.
U jeziku C++, return izraz;
(pri čemu je izraz
izraz) je naredba koja govori funkciji da vrati izvršavanje programa pozivajućoj funkciji, i kaže kolika je vrijednost od izraz
. Ako funkcija nema povratni tip (tj. njezin povratni tip je void), naredba povratka se može rabiti bez vrijednosti, u kojem pak slučaju program jednostavno izlazi iz trenutne funkcije i vraća se pozivajućoj.
U Pascalu ne postoji naredba povratka. Potprogrami se automatski vraćaju kad izvršavanje dosegne posljednju izvodivu naredbu. Vrijednosti se mogu vratiti dodjeljivanjem identifikatoru koji ima isto ime kao i potprogram (funkciji u Pascalovoj terminologiji).
Određeni programski jezici, kao što su Perl i Ruby, dopuštaju programeru izostavljanje eksplicitnih naredbi povratka, na taj način specificirajući da je posljednji evaluirani izraz povratna vrijednost potprograma. Vrijednosti koje vrati program prilikom terminacije hvataju batch programi.
Sintaksa
Naredbe povratka dolaze u mnogo oblika. Sljedeće su sintakse najuobičajenije:
Kao što rabe C, C++, Java, PHP, C#:
return ''vrijednost'';
Kao što rabi Smalltalk:
^ ''vrijednost''
Kao što rabi Lisp:
(return ''vrijednost'')
Kao što rabi BASIC:
RETURN
Kriticizam
Neki razvijatelji i obrazovatelji računalnog programiranja izbjegavaju uporabu eksplicitnih naredbi povratka osim na tekstualnom kraju potprograma, smatrajući da, kad se rabi za "preran povratak", pati od istih problema čitljivosti kao i GOTO naredba. Kao i sa GOTO, postoji problem da se u daljnjem razvijanju naredba povratka može previdjeti od strane razvijatelja, te se akcija koja bi se trebala obaviti na kraju potprograma možda neće obaviti (u svim slučajevima).
Međutim, općenito je privaćeno da se naredba povratka ne bi trebala smatrati štetnom kao GOTO, s obzirom da samo dozvoljava skakanje na jedno istaknuto mjesto potprograma te se, kao rezultat toga, rabi sa znatno manjom učestalošću. Štoviše, povratna vrijednost funkcije je obično (u suvremenim popularnim programskim jezicima) eksplicitno specificirana u naredbi povratka.
Također, u jezicima kao što je Java, try..finally konstrukt se može rabiti za zajamčeno obavljanje akcije na samom kraju potprograma, nakon što je bilo koja naredba povratka izvršena. finally podnaredba će se izvršiti čak i ako je bačena iznimka (iznimka se automatski hvata, i potom ponovno baca nakon što je finally podnaredba izvršena, osim ako finally podnaredba i sama ne baci iznimku). U slučaju prikladnog korištenja (npr. za zatvaranje datotečnih ručica), ovo eliminira potrebu za iznalaženjm svih točka izlaska i dodavanja zalihosnih naredbi neposredno prije njih, ili za refaktoriranjem potprograma u svrhu micanja naredbi povratka - i jedan i drugi postupak su skloni grješkama.
Aspektno orijentirano programiranje se može također rabiti za ostvarivanje konstrukta sličnom try..finally bloku - s ili bez ponašanja automatskog hvaćanja iznimke - iako je izvorno namijenjeno konciznijem izražavanju ponašanja koji "presijecaju" više od jednog potprograma.