For petlja
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 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 sa 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
Ovaj tip petlje za nalazimo u gotovo svim jezicima koje dijele zajedničke baštine sa 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 petlje'tri 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.
It might be that during the preparation of the right-hand side's values the compiler might deduce that the rather odd integer arithmetic expression generates either zero or one in a simple pattern and so would produce code that does not perform the evaluations, but this is unlikely. Better results would likely be gained by
A:=0; %Mass assignment to an array. forall i:=1:N do A(i,i):=1; %Too complex for simple array assignment.
Though a language designed to support array manipulation and especially matrix arithmetic might well allow some syntax that identifies the diagonal of a square array, so that the second statement might become
Diag(A):=1;
Istovjetnost s while petljama
A for loop can always be converted into an equivalent while loop by incrementing a counter variable directly. The following pseudocode illustrates this technique:
faktorijela := 1 for brojac from 1 to 5: faktorijela := faktorijela * brojac
is easily translated into the following while loop:
faktorijela := 1 brojac := 1 while brojac <= 5: faktorijela := faktorijela * brojac brojac := brojac + 1
Sintaksa
Given an action that must be repeated, for instance, five times, different languages' for loops will be written differently. The syntax for a three-expression for loop is nearly identical in all languages that have it, after accounting for different styles of block termination and so on (example is C):
for (brojac = 1; brojac <= 5; brojac++) naredbe;
The numeric-range for loop varies somewhat more. Pascal would write it:
for Brojac := 1 to 5 do naredbe;
Whereas Perl would use:
for($brojac = 1; $brojac <= 5; ++$brojac) { naredbe; }
(Note that for(1..5) { }
is really a foreach in Perl.)
Iterator for loops most commonly take a form such as this (example is Python):
for brojac in range (1, 6): # range() gives values to one less than the second argument naredbe
But the PHP equivalent (virtually never used for simple repetition but noted here for completeness):
foreach (range(1,5) as $i) naredbe;
Contrary to other languages, in Smalltalk a for loop is not a language construct but defined in the class Number as a method with two parameters, the end value and a closure, using self as start value.
1 to: 5 do: [ "naredbe" ]
Vremeplov for petlji u raznim programskim jezicima
1966: FORTRAN 66
FORTRAN 66's equivalent of the for
loop is the DO
loop. The syntax of Fortran's DO
loop is:
DO label counter=start, stop, step label naredbe
Example:
PROGRAM MAIN SUM SQ=0 DO 101 I=1,9999999 IF (SUM SQ.GT.1000) GO TO 109 SUM SQ=SUM SQ+I**2 101 CONTINUE 109 CONTINUE END
The fortran DO loop caused an orbit computation error in a Mercury flight, and was long suspected to have caused the crash of the Mariner 1 space rocket on 22 July 1962 - C.A.R. Hoare, in particular a missing comma in the wrong place can drastically alter the meaning of the loop. Example:
DO 101 I=1.9999999 101 CONTINUE
Because of the peculiar feature of fortran that spaces are not significant, this is interpreted as a single assignment to the (probably undeclared) variable DO101I
. In the subsequent FORTRAN 77 specification an additional comma was required in the DO
loop syntax.
1968: Algol68
Algol68 has what was considered the universal loop, the full syntax is:
for i from 1 by 1 to 3 while i≠4 do ~ od
There are several unusual aspects of the construct
- only the do ~ od portion was compulsory, in which case the loop will iterate indefinitely.
- thus the clause to 100 do ~ od, will iterate only 100 times.
- the while "syntactic element" allowed a programmer to break from a for loop early, as in:
int sum sq:=0; for i while print (("So far:",i, newline)); sum sq≤1000 do sum sq+:=i↑2 od
Subsequent "extensions" to the standard Algol68 allowed the to syntactic element to be replaced with upto and downto to achieve a small optimization. The same compilers also incorporated:
- until - for late loop termination.
- foreach - for working on arrays in parallel.
1977: FORTRAN 77
FORTRAN 77's equivalent of the for
loop is the DO
loop. The syntax of Fortran's DO
loop is:
DO label, counter=start, stop, step label naredbe
Example:
PROGRAM MAIN SUM SQ=0 DO 101, I=1,9999999 IF (SUM SQ.GT.1000) GO TO 109 SUM SQ=SUM SQ+I**2 101 CONTINUE 109 CONTINUE END
Vidjeti također