U računarstvu, for petlja je naredba programskog jezika koja dopušta uzastopno izvršavanje koda. For petlja se klasificira kao iterativna naredba.

Za razliku od drugih petlji, poput while petlje, for petlja se razlikuje postojanjem eksplicitnog brojača petlje ili varijable petlje. Ovo dopušta tijelu petlje (kodu koji se opetovano izvršuje) svjesnost o sekvenciranju svake iteracije. For petlje se tipično koriste kad je broj iteracija poznat prije ulaska u petlju.

Ime "for petlja" dolazi od engl. riječi for koja se koristi kao ključna riječ u većini programskih jezika. U FORTRAN-u i PL/I se, međutim, koristi ključna riječ DO i zvana je "do petljom", dok je u svim drugim pogledima istovjetna ovdje opisanoj for petlji.

Vrste for petlji

Naredba for petlje je dostupna u većini imperativnih programskih jezika. Čak i ignorirajući manje razlike u sintaksi, postoje mnoge razlike u načinu na koje ove naredbe rade i razini ekspresivnosti koju pružaju. Općenito for petlje potpadaju u jednu od sljedećih kategorija:

Numerički opsezi

Ova je vrsta for petlje karakterizirana brojanjem - enumeriranjem svake od vrijednosti unutar cjelobrojnog numeričkog opsega ili aritmetičkim napredovanjem. Opseg je često specificiran početnim i završnim brojem, i ponekad uključuje vrijednost koraka (dopuštajući primjerice brojanje po dva, ili npr. unazad). Reprezentativan primjer u BASIC-u jest:

FOR I = 1 TO 10 ''tijelo petlje'' NEXT I

Varijabla petlje I će poprimiti vrijednosti 1, 2, ..., 9, 10 u svakoj od deset iteracija tijela petlje, koje će se izvršiti u tom redoslijedu. Svaki računalni jezik, pa čak i različiti dijalekti istog jezika (npr. BASIC), ima razlčite ključne riječi za for petlju i različite načine određivanja početnih, završnih i vrijednosti koraka.

Rijetko dostupno poopćenje dopušta vrijednostima početka, kraja i koraka da budu specificirane kao stavke u listi, a ne samo kao aritmetički niz; primjerice:

for i:=2,3,5,7,11 do ''itd.'' Pri čemu svaki stavak liste može i sam biti aritmetički niz. Obična je for petlja stoga primjer liste sa samo jednim elementom.

For petlje zasnovane na iteratorima

Ova vrsta petlje je poopćenje one vrste for petlje koja barata numeričkim opsezima, s obzirom na to da dopušta enumeriranje skupova stavaka (elemenata) koji ne moraju biti nizovi brojeva. Obično je karakterizirana uporabom implicitnog ili eksplicitnog iteratora, u kojem varijabla petlje poprima svaku od vrijednosti niza ili neke druge uredive podatkovne kolekcije. Kanonski primjer u Pythonu jest:

for item in lista: ''tijelo petlje''

Pri čemu je lista ili podatkovna kolekcija koja implicitno podržava iteriranje, ili sama može biti eksplicitni iterator. Neki jezici imaju ovo kao dodatak drugoj sintaksi for petlje; prije svega PHP posjeduje ovu vrstu petlje pod imenom foreach kao i kao troizraznu for petlju (vidjeti dolje) pod imenom for.

Složene for petlje

Uvedene u Algol-68 nakon čega su ostvarane i u PL/I, dopuštaju da iteriranje petlje bude složeno s ispitivanjem, kao u:

for i:=1:N while A(i) > 0 do itd.

To jest, vrijednost je dodijeljena varijabli petlje i i tijelo će petlje biti izvršeno samo ako je while izraz istinit. Ako je rezultat lažan''', izvršavanje se for petlje zaustavlja. Pod pretpostavkom da je vrijednost varijable petlje definirana nakon terminacije petlje, gornja će naredba naći prvi nepozitivan element niza A (ako takav ne postoji, njegova će vrijednost biti N+1) ili, s prikladnim varijacijama, prvi znak nebjeline u stringu, itd.

For petlje s tri izraza

mini|170px|for loop diagram Ovaj tip petlje za nalazimo u gotovo svim jezicima koje dijele zajedničke baštine s C programskom jeziku. Ona se odlikuje tri parametra petlja kontrole izražavanja; se sastoji od initializer, loop-test, i brojanje izražavanja. Predstavnik primjer u C je: for (brojac = 0; counter <10; brojac + +)tijelo petljetri kontrolna izraza, odvojenih zarezima ovdje, su s lijeva na desno initializer izražavanja, testa izraz petlji, i računajući izraz. Initializer se ocjenjuje točno jednom na početku. Izraz petlja testa se procjenjuje na početku svake iteracije kroz petlju, a određuje kada treba petlja izlaz. Konačno, računajući izraz se ocjenjuje na kraju svake iteracije petlje, i obično je odgovorna za mijenjanje varijable petlje. U većini jezika koji pružaju ovu vrstu for petlji, svaka od tri kontrolna petlja izraza nije obavezan. Kad izostavili testiranje izraz petlju uzima uvijek biti istina, dok initializer i prebrojavanja izrazi tretiraju kao ne-OPS-a kada je ispuštena. Zarezom u sintaksi su dovoljno navesti izostavljanje jednog od izraza. Neki primjeri su: int i = 0; for ( ; i<10; ) { i++;

or this,

int i = 0; for ( ; ; i++ ) { if ( i >= 10 ) break;

Primijetite da u normalnom korištenju, naziv varijable iteracija ponavlja u svakoj od tri dijela. Korištenje drugo ime u bilo kojem dijelu vrijedi sintaksa, iako je rezultiralo ponašanje ne bi moglo biti željeni. == Dodatna semantika i konstrukti == === Upotreba kao beskonačne petlje === Ova C-style for petlje je obično izvor beskonačnu petlju od temeljnih koraka iteracije su potpuno u kontroli programer. U stvari beskonačne petlje, kada su namijenjene, za ovu vrstu petlje se često koristi (s praznim izrazima), kao što su:

for (;;) tijelo petlje Rani izlazak i nastavljanje

Neki jezici mogu također osigurati ostale prateće izvještaje, koji kada se danas može mijenjati kako za iteracija petlje prihoda. Zajednička među njima su break i nastavite izjavama pronađena C i njegovi derivati. break naredbe uzrokuje unutrašnje-najviše petlje biti prestaje odmah našto proveden. nastavlja iskaz će krenuti odmah na sljedeću iteraciju bez daljnjeg napredak kroz petlju tijelo za tekuće iteracije. drugim jezicima svibanj imati slične izjave ili na drugi način osigurati sredstva mijenjati za napredak petlji, npr. u Fortranu 95: DO I = 1,N I = 7 !Overt adjustment of the loop variable. Compiler complaint likely. Z = ADJUST(I) !Function ADJUST might alter I, to uncertain effect. normal statements IF (no good) CYCLE !Skip this value of I, continue with the next. statements IF (finish now!) EXIT !Abandon the loop. statements END DO Nažalost, jasna vodeća daje OSNOVNI nije slijedio i takoEND DOne identificiraju varijable petlje se smatra da pripadaju u, i još gore, niti CIKLUS'iEXIT ' izjave. To postaje još važnije kada su mnoge i ugniježđene petlje su uključeni. EXITmogu čak smatra kaoizlazpostupak, umjestopetlja izlaz: fraze poputNEXTa možda sam,DONEXT jai DOQUIT Jaili slično eksplicitno indikacije će pomoći kako bi zabluda vidljivija. Djelomično rješenje nudi se kroz sintakse nastavak (u Fortranu i PL / I, na primjer), čime je naljepnica povezan s'DO izjavu i istom oznakom tekst je dodan na kraju markera, kao što sux: DO I = 1, NiEND DO xna primjer, nakon čega CIKLUS x'ixEXIT bi se mogla koristiti. Međutim, radeći izravno protiv objektivno, tekst oznakuxne smije biti ime varijable petlje, tako da "ja" neće biti dozvoljeno (iako "II" bi biti), i, ako ima je drugi takav petlju kasnije u rutinu, različite oznake tekstovima bi da bude izabran. Doseg i semantika varijable petlje

Različiti jezici odrediti različite pravila za koju vrijednost varijable petlje održat će na završetku svojih petlje, i doista neki drže da je to "postaje nedefiniran". To omogućava sastavljač za generiranje koda koji ostavlja bilo koju vrijednost u varijablu petlje, ili možda čak i ostavlja je bez promjena, jer petlje vrijednost održan je u registar i nikada pohranjuju memory.In nekim jezicima (ne C ili C + +) petlje varijabla nepromjenjivi u okviru tijela petlje, uz svaki pokušaj to promijeniti njegovu vrijednost i smatra se semantička pogreška. Takve promjene su često posljedica pogreške programer, koji može biti vrlo teško utvrditi nakon što je napravio. Međutim samo očit promjene su vjerojatno da će biti otkriven kod kompajler. Situacije gdje adresu varijable petlje je prošao kao argument potprogram čine ga vrlo teško provjeriti, jer je rutinsko ponašanje općenito nepristupačan to kompajler

Ipak Druga mogućnost je da generira kôd može zaposliti pomoćne varijable petlje varijablu, eventualno održava u stroju registar, čija je vrijednost svibanj ili svibanj ne biti kopiran tojana svakoj iteraciji. U ovom slučaju, izmjeneJaneće utjecati na kontrolu petlje, ali sada je moguće disjunkcije: unutar petlje, reference na vrijednostijabi moglo biti to (moguće mijenjati) struje VrijednostJaili pomoćne varijable (održan siguran od nepravilne izmjene) i zbunjujuće rezultati su zagarantirani. Na primjer, unutar petlje referencu na elementjapolja vjerojatno bi zapošljavao pomoćne varijable (posebno ako se u stroju registar), ali akojaje parametar neke rutine (npr. ,print-izjavu da bi se otkrilo njegovu vrijednost), to bi vjerojatno biti odgovarajuće varijablejaumjesto. To je najbolje izbjegavati takve mogućnosti. Razlikovanje for petlji zasnovanih na iteratorima i onih numeričkih

Jezika se može ponuditi i iterator na bazizapetlje i numerički-basedzapetlja u, naravno, svoje sintakse. To može izgledati da je brojčana petlja-temeljen uvijek se može zamijeniti odgovarajućim loop-based iterator, ali razlike mogu nastati. Pretpostavimo da polje'ima elemente 1 doN, a jezik ne nude jednostavna pridruživanja: = 3 *;, tako da neke vrste for petlje moraju razvijati. Zatim u pseudocode, dvije verzije bi mogle biti za i: = 1: N do (i): = 3 * (i), pored i; forall i: = 1: N do (i): = 3 * (i), koji su očito ekvivalent, dapače čini razlika samo sintaksu trivijalnost, ali, semantika su različite. 'Forall verzija je da se smatra kao masovna zadatkom u kojem pojmovno, sva desna strana rezultati vrednuju i lijeve strane nalaze se primatelji, onda su učinili zadatke. Kod kompajlera smišlja da je to efekt neutvrđenih, ali ideja je da nijedan predmet s lijeve strane se mijenja prije svih stavki na desnoj strani su ocijenili, svaki element je dodijeljena samo jednom.

Sada pretpostavimo da je uvjet je da svaki element se prosjek sebe i svoja dva susjeda, a zbog jednostavnosti, pretpostavimo da je prvi i posljednji elementi moraju biti nepromijenjeni. Zatim, petlje postaju za i: = 2: N-1 do A (i): = [(i-1) + (i) + (i +1)] / 3; Dalje ja, ja pi: = 2: N-1 do A (i): = [(i-1) + (i) + (i +1)] / 3; U ovom slučaju, rezultati će biti različiti: jer zapetlja se izvodi kao uzastopna iteracija, elementa (i-1) održat će vrijednost koja je pravedan bio izračunava prethodne iteracije, a ne izvorna vrijednost, dok je uforallverziju, ona bi još uvijek nije su se promijenila. Pod uvjetom naravno da je prevodilac provedbu'forall konstrukt ne, u stvari, podupirati to tumačenje. Ova razlika svibanj ili svibanj ne biti važno. Ako ne, ovisno o tome što pokreće najbrže mogli biti izabrani. No, razlika može biti vitalna, kako je u pojedinim fazama LU dekompozicija algoritam za samo jedan primjer.

Složenijezapetlje (posebno s uvjetno grananje) će uvesti dodatne teškoće najvjerojatnije neće biti smješteni po sintaksu forall'izjave. Umjesto da pokuša pretvoritizaizjavu u'forall priopćenju, zadaća treba revidirati u smislu dodjele jedne strukture podataka (npr. polje) do drugog istog tipa, izbjegavajući složene uvjetima. Na primjer, s obzirom na cijeli broj podjela u kojima 3 / 4 = 0, kvadrat polje'može se inicira na identitet matrica kako slijedi: pi i: = 1: n, j: = 1: n do A (i, j): = (i / j) * (j / i);% = 1 ako i = j, inače nula. Evo, desna strana nije stvarna kvadratnih polja kao što suA, već izraz generiranje vrijednosti za svaki element ipak, koja bi se mogla smatrati kao formiranje fiktivnog polja. ''''Izjave forall stoga poopćenje jednostavnije array-izjava zadatka, u kojem obje strane izraza moraju biti stvarni polja.