Pentru bucla - For loop
| Construcții de buclă |
|---|
În informatică , un for-loop (sau pur și simplu pentru loop ) este o instrucțiune de flux de control pentru specificarea iterației , care permite executarea repetată a codului . Diverse cuvinte cheie sunt folosite pentru a specifica această afirmație: descendenții ALGOL folosesc „pentru”, în timp ce descendenții lui Fortran folosesc „face”. Există și alte posibilități, de exemplu COBOL care folosește „PERFORM VARING”.
O buclă for are două părți: un antet care specifică iterația și un corp care se execută o dată pe iterație. Antetul declară adesea un contor de buclă explicit sau o variabilă de buclă, care permite corpului să știe ce iterație se execută. For-buclele sunt de obicei utilizate atunci când numărul de iterații este cunoscut înainte de a intra în buclă. For-buclele pot fi considerate ca abrevieri pentru buclele while care incrementează și testează o variabilă de buclă.
Numele pentru buclă provine din cuvântul pentru , care este folosit ca cuvânt cheie în multe limbaje de programare pentru a introduce o buclă pentru. Termenul în limba engleză datează din ALGOL 58 și a fost popularizat în influența ulterioară ALGOL 60 ; este traducerea directă a für-ului german anterior , folosită în Superplan (1949–1951) de Heinz Rutishauser , care a fost implicat și în definirea ALGOL 58 și ALGOL 60. Corpul buclei este executat „pentru” valorile date ale variabilei buclei , deși acest lucru este mai explicit în versiunea ALGOL a declarației, în care poate fi specificată o listă de valori posibile și / sau incremente.
În FORTRAN și PL / I , cuvântul cheie DO este folosit pentru același lucru și se numește do-loop ; acest lucru este diferit de o buclă do-while .
PENTRU
O declarație pentru buclă este disponibilă în majoritatea limbajelor de programare imperative . Chiar și ignorând diferențe minore de sintaxă, există multe diferențe în modul în care funcționează aceste afirmații și nivelul de expresivitate pe care îl susțin. În general, buclele for se încadrează în una dintre următoarele categorii:
Bucle tradiționale
Bucla pentru limbaje precum ALGOL , Simula , BASIC , Pascal , Modula , Oberon , Ada , Matlab , Ocaml , F # și așa mai departe, necesită o variabilă de control cu valori inițiale și finale și arată așa:
for i = first to last do statement
(* or just *)
for i = first..last do statement
În funcție de limbă, un semn de atribuire explicit poate fi utilizat în locul semnului egal (iar unele limbi necesită cuvântul intchiar și în cazul numeric). Poate fi inclusă, de asemenea, o valoare pas pas opțională (o creștere sau scădere ≠ 1), deși sintaxele exacte utilizate pentru aceasta diferă puțin mai mult între limbi. Unele limbi necesită o declarație separată a variabilei de control, altele nu.
O altă formă a fost popularizat de limbajul de programare C . Necesită 3 părți: inițializarea ( varianta buclei ), condiția și avansarea la următoarea iterație. Toate aceste trei părți sunt opționale. Acest tip de „puncte punct și virgulă” provine din limbajul de programare B și a fost inițial inventat de Stephen Johnson .
În partea de inițializare, toate variabilele necesare sunt declarate (și de obicei atribuite valorile). Dacă sunt declarate mai multe variabile, toate acestea ar trebui să fie de același tip. Partea de condiție verifică o anumită condiție și iese din buclă dacă este falsă. Avansarea către următoarea parte de iterație se realizează exact o dată de fiecare dată când se termină bucla. Bucla este apoi repetată dacă condiția se evaluează la adevărat.
Iată un exemplu de buclă tradițională în stil C în Java .
// Prints the numbers from 0 to 99 (and not 100), each followed by a space.
for (int i=0; i<100; i++)
{
System.out.print(i);
System.out.print(' ');
}
System.out.println();
Aceste bucle sunt, de asemenea, numite uneori numere pentru bucle numerice atunci când sunt contrastate cu bucle foreach (vezi mai jos).
Bucle pentru iteratoare
Acest tip de buclă for este o generalizare a tipului de interval numeric de buclă for, deoarece permite enumerarea seturilor de elemente, altele decât secvențele numerice. De obicei, se caracterizează prin utilizarea unui iterator implicit sau explicit , în care variabila buclă preia fiecare dintre valorile dintr-o secvență sau altă colectare de date. Un exemplu reprezentativ în Python este:
for item in some_iterable_object:
do_something()
do_something_else()
Unde some_iterable_objecteste fie o colecție de date care acceptă iterația implicită (cum ar fi o listă cu numele angajaților), fie poate fi de fapt un iterator în sine. Unele limbi au acest lucru în plus față de o altă sintaxă pentru buclă; în special, PHP are acest tip de buclă sub nume for each, precum și o buclă pentru trei expresii pentru buclă (a se vedea mai jos) sub nume for.
Bucle vectorizate pentru
Unele limbi oferă o buclă for care acționează ca și cum ar procesa toate iterațiile în paralel , cum ar fi for allcuvântul cheie din FORTRAN 95, care are interpretarea că toate expresiile din partea dreaptă sunt evaluate înainte de efectuarea oricărei atribuții, distinct de iterația explicită formă. De exemplu, în fordeclarația din următorul fragment de pseudocod, atunci când se calculează noua valoare pentru A(i), cu excepția primei (cu i = 2) referința la A(i - 1)va obține noua valoare care a fost plasată acolo în pasul anterior. Cu for alltoate acestea, în versiune, fiecare calcul se referă doar la original, nealterat A.
for i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; next i; for all i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3;
Diferența poate fi semnificativă.
Unele limbi (cum ar fi FORTRAN 95, PL / I) oferă, de asemenea, instrucțiuni de atribuire de matrice, care permit omiterea multor bucle for. Astfel, pseudocodul care A := 0;ar seta toate elementele matricei A la zero, indiferent de mărimea sau dimensionalitatea sa. Bucla de exemplu ar putea fi redată ca
A(2 : N - 1) := [A(1 : N - 2) + A(2 : N - 1) + A(3 : N)] / 3;
Dar dacă acest lucru ar fi redat în stilul pentru buclă pentru sau pentru buclă pentru toate sau altceva poate să nu fie descris clar în manualul compilatorului.
Compuse pentru bucle
Introdus cu ALGOL 68 și urmat de PL / I , acest lucru permite iterația unei bucle să fie combinată cu un test, ca în
for i := 1 : N while A(i) > 0 do etc.
Adică, o valoare este atribuită variabilei de buclă i și numai dacă expresia while este adevărată , corpul buclei va fi executat. Dacă rezultatul a fost fals , execuția for-loop se oprește scurt. Acordat că valoarea variabilei de buclă este definită după terminarea buclei, atunci afirmația de mai sus va găsi primul element nepozitiv din matricea A (și dacă nu există astfel, valoarea sa va fi N + 1 ) sau, cu variații adecvate , primul caracter ne-gol dintr-un șir și așa mai departe.
Contoare de bucle
În programarea computerului, un contor de buclă este variabila care controlează iterațiile unei bucle (o construcție de limbaj de programare pentru computer ). Se numește așa deoarece majoritatea utilizărilor acestui construct au ca rezultat variabila luând un interval de valori întregi în unele secvențe ordonate (de exemplu, începând cu 0 și terminând cu 10 în trepte de 1)
Contoare de bucle se schimbă cu fiecare iterație a unei bucle, oferind o valoare unică pentru fiecare iterație individuală. Contorul de buclă este utilizat pentru a decide când bucla ar trebui să se încheie și pentru ca fluxul de programe să continue la următoarea instrucțiune după buclă.
O convenție comună de denumire a identificatorului este ca contorul de buclă să utilizeze numele variabilelor i , j și k (și așa mai departe dacă este necesar), unde i- ar fi cea mai exterioară buclă, j următoarea buclă interioară etc. Ordinea inversă este folosit și de unii programatori. Acest stil este, în general, de acord să aibă originea din programarea timpurie a FORTRAN , unde aceste nume de variabile care încep cu aceste litere au fost declarate implicit ca având un tip întreg, la fel și alegerile evidente pentru contoare de bucle care erau necesare doar temporar. Datele de practică susține și în continuare a notație matematice în cazul în care indicii pentru sume și înmulțiri sunt de multe ori i , j , etc. O variantă convenție este utilizarea literelor reduplicată pentru indicele, ii , jj , și kk , deoarece acest lucru permite căutarea mai ușoară și Search - înlocuind decât folosind o singură literă.
Exemplu
Un exemplu de cod C care implică imbricate pentru bucle, unde variabilele contorului de buclă sunt i și j :
for (i = 0; i < 100; i++) {
for (j = i; j < 10; j++) {
some_function(i, j);
}
}
S-a arătat că o buclă imbricată, ca în exemplul de mai sus, efectuează mai multe calcule pe unitate de timp decât o buclă fără ea. Această optimizare independentă de mașină înseamnă că bucla imbricată va termina mai repede, având în vedere același număr de calcule de efectuat. Acesta este un avantaj imbricat pentru buclă peste buclă imbricată while, care se comportă diferit.
Pentru buclele din C pot fi utilizate și pentru a imprima reversul unui cuvânt. La fel de:
for (i = 0; i < 6; i++) {
scanf("%c", &a[i]);
}
for (i = 4; i >= 0; i--) {
printf("%c", a[i]);
}
Aici, dacă intrarea este apple, ieșirea va fi elppa.
Semantică și constructe suplimentare
Folosiți ca bucle infinite
Această buclă în stil C este de obicei sursa unei bucle infinite, deoarece pașii fundamentali ai iterației sunt complet în controlul programatorului. De fapt, atunci când sunt intenționate bucle infinite, acest tip de buclă for poate fi utilizat (cu expresii goale), cum ar fi:
for (;;)
//loop body
Acest stil este folosit în loc de while (1)bucle infinite pentru a evita o avertizare de conversie de tip în unele compilatoare C / C ++. Unii programatori preferă forma mai succintă for (;;)decât cea semantic echivalentă, dar mai detaliată while (true).
Ieșirea timpurie și continuarea
Unele limbi pot furniza, de asemenea, alte declarații de susținere, care, atunci când sunt prezente, pot modifica modul în care se desfășoară iterația pentru buclă. Cele mai frecvente dintre acestea sunt declarațiile de pauză și continuare găsite în C și derivatele sale. Instrucțiunea break face ca bucla cea mai internă să fie terminată imediat când este executată. Instrucțiunea continue se va muta imediat la următoarea iterație fără a mai progresa prin corpul buclei pentru iterația curentă. O instrucțiune for se termină, de asemenea, atunci când se execută o instrucțiune break, go sau return în cadrul instrucțiunii. [Wells] Alte limbi pot avea afirmații similare sau pot furniza în alt mod mijloace pentru a modifica progresul pentru buclă; de exemplu în FORTRAN 95:
DO I = 1, N
statements !Executed for all values of "I", up to a disaster if any.
IF (no good) CYCLE !Skip this value of "I", continue with the next.
statements !Executed only where goodness prevails.
IF (disaster) EXIT !Abandon the loop.
statements !While good and, no disaster.
END DO !Should align with the "DO".
Unele limbi oferă facilități suplimentare, cum ar fi denumirea diferitelor instrucțiuni de buclă, astfel încât, cu mai multe bucle imbricate, nu există nicio îndoială cu privire la ce buclă este implicată. Fortran 95, de exemplu:
X1:DO I = 1,N
statements
X2:DO J = 1,M
statements
IF (trouble) CYCLE X1
statements
END DO X2
statements
END DO X1
Astfel, atunci când se detectează „probleme” în bucla interioară, CICLUL X1 (nu X2) înseamnă că săritura va fi la următoarea iterație pentru I, nu J. Compilatorul va verifica, de asemenea, dacă fiecare END DO are eticheta corespunzătoare. pentru poziția sa: acesta nu este doar un ajutor pentru documentare. Programatorul trebuie să codeze în continuare problema corect, dar unele gafe posibile vor fi blocate.
Domeniu variabil de buclă și semantică
Diferite limbi specifică reguli diferite pentru ce valoare va deține variabila buclă la terminarea buclei sale și, într-adevăr, unele consideră că „devine nedefinită”. Acest lucru permite unui compilator să genereze cod care lasă orice valoare în variabila buclă, sau poate chiar o lasă neschimbată deoarece valoarea buclei a fost păstrată într-un registru și niciodată stocată în memorie. Comportamentul real poate varia chiar și în funcție de setările de optimizare ale compilatorului, ca și în cazul compilatorului Honywell Fortran66.
În unele limbi (nu C sau C ++ ) variabila buclă este imuabilă în sfera corpului buclei, orice încercare de modificare a acesteia fiind considerată o eroare semantică. Astfel de modificări sunt uneori o consecință a unei erori de programare, care poate fi foarte dificil de identificat odată făcute. Cu toate acestea, este posibil ca numai modificările evidente să fie detectate de compilator. Situațiile în care adresa variabilei de buclă este transmisă ca argument către un subrutină fac foarte dificilă verificarea, deoarece comportamentul rutinei este în general necunoscut compilatorului. Câteva exemple în stilul lui Fortran:
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 !Memory might fade that "I" is the loop variable.
PRINT (A(I), B(I), I = 1, N, 2) !Implicit for-loop to print odd elements of arrays A and B, reusing "I"...
PRINT I !What value will be presented?
END DO !How many times will the loop be executed?
O abordare obișnuită este calcularea numărului de iterații la începutul unei bucle (cu o atenție atentă la deversare ca în for i := 0 : 65535 do ... ;aritmetica întreagă de șaisprezece biți) și cu fiecare iterație decrementează acest număr, ajustând în același timp și valoarea lui I : rezultate de numărare dublă. Cu toate acestea, ajustările valorii lui I în buclă nu vor schimba numărul de iterații executate.
O altă posibilitate este că codul generat poate utiliza o variabilă auxiliară ca variabilă de buclă, posibil deținută într-un registru al mașinii, a cărei valoare poate sau nu să fie copiată la I pe fiecare iterație. Din nou, modificările lui I nu ar afecta controlul buclei, dar acum este posibilă o disjuncție: în cadrul buclei, referințele la valoarea lui I ar putea fi la valoarea curentă (posibil modificată) a lui I sau la variabila auxiliară (deținută în condiții de siguranță împotriva modificărilor necorespunzătoare) și rezultatele confuze sunt garantate. De exemplu, în cadrul buclei o referință la elementul I al unui tablou ar folosi probabil variabila auxiliară (mai ales dacă ar fi păstrată într-un registru al mașinii), dar dacă I este un parametru pentru o rutină (de exemplu, o declarație de tipărire la dezvăluie valoarea acestuia), ar fi probabil o referință la variabila corectă I în schimb. Cel mai bine este să evitați astfel de posibilități.
Ajustarea limitelor
La fel cum variabila index ar putea fi modificată într-o buclă for, tot așa pot fi limitele și direcția acesteia. Dar cu efect incert. Un compilator poate preveni astfel de încercări, este posibil să nu aibă niciun efect sau chiar ar putea funcționa corect - deși mulți ar declara că acest lucru ar fi greșit. Luați în considerare o afirmație precum
for i := first : last : step do A(i) := A(i) / A(last);
Dacă abordarea compilării unei astfel de bucle urma să fie evaluarea primului , ultimului și pasului și calcularea unui număr de iterații printr- (last - first)/stepo singură dată la început, atunci dacă acele elemente erau variabile simple și valorile lor au fost cumva ajustate în timpul iterații, acest lucru nu ar avea niciun efect asupra numărului de iterații, chiar dacă elementul selectat pentru divizare prin A(last)modificat.
Lista intervalelor de valori
PL / I și Algol 68, permit bucle în care variabila de buclă este iterată pe o listă de intervale de valori în loc de un singur interval. Următorul exemplu PL / I va executa bucla cu șase valori de i: 1, 7, 12, 13, 14, 15:
do i = 1, 7, 12 to 15;
/*statements*/
end;
Echivalența cu buclele de timp
O buclă for este în general echivalentă cu o buclă while:
factorial := 1
for counter from 2 to 5
factorial := factorial * counter
counter := counter - 1
print counter + "! equals " + factorial
este echivalent cu:
factorial := 1
counter := 1
while counter < 5
counter := counter + 1
factorial := factorial * counter
print counter + "! equals " + factorial
după cum demonstrează rezultatul variabilelor.
Cronologia sintaxei for-loop în diferite limbaje de programare
Având în vedere o acțiune care trebuie repetată, de exemplu, de cinci ori, diferite bucle pentru limbi diferite vor fi scrise diferit. Sintaxa pentru o buclă pentru trei expresii este aproape identică în toate limbile care o au, după ce se iau în calcul diferite stiluri de terminare a blocului și așa mai departe.
1957: FORTRAN
Echivalentul Fortran al buclei for este bucla DO , folosind cuvântul cheie do în loc de for, Sintaxa buclei DO a lui Fortran este:
DO label counter = first, last, step
statements
label statement
Următoarele două exemple se comportă echivalent cu cele trei argumente pentru buclă în alte limbi, inițializând variabila contorului la 1, incrementând cu 1 fiecare iterație a buclei și oprindu-se la cinci (inclusiv).
DO 9, COUNTER = 1, 5, 1
WRITE (6,8) COUNTER
8 FORMAT( I2 )
9 CONTINUE
În Fortran 77 (sau mai târziu), acest lucru poate fi scris și ca:
do counter = 1, 5
write(*, '(i2)') counter
end do
Partea pasului poate fi omisă dacă pasul este unul. Exemplu:
* DO loop example.
PROGRAM MAIN
SUM SQ = 0
DO 199 I = 1, 9999999
IF (SUM SQ.GT.1000) GO TO 200
199 SUM SQ = SUM SQ + I**2
200 PRINT 206, SUMSQ
206 FORMAT( I2 )
END
Spațiile sunt irelevante în instrucțiunile Fortran de formă fixă, astfel SUM SQ este același cu SUMSQ . În stilul modern Fortran în formă liberă, semifabricatele sunt semnificative.
În Fortran 90, GO TO poate fi evitat prin utilizarea unei declarații EXIT .
* DO loop example.
program main
implicit none
integer :: sumsq
integer :: i
sumsq = 0
do i = 1, 9999999
if (sumsq > 1000.0) exit
sumsq = sumsq + i**2
end do
print *, sumsq
end program
1958: ALGOL
ALGOL 58 a introdus fordeclarația, folosind formularul ca Superplan:
FOR Identifier = Base (Difference) Limit
De exemplu, pentru a imprima 0-10 crescute cu 1:
FOR x = 0 (1) 10 BEGIN PRINT (FL) = x END
1960: COBOL
COBOL a fost oficializat la sfârșitul anului 1959 și a avut multe elaborări. Folosește verbul PERFORM, care are multe opțiuni. Inițial, toate buclele trebuiau să fie în afara liniei, codul iterat ocupând un paragraf separat. Ignorând necesitatea declarării și inițializării variabilelor, echivalentul COBOL al unui for -loop ar fi.
PERFORM SQ-ROUTINE VARYING I FROM 1 BY 1 UNTIL I > 1000
SQ-ROUTINE
ADD I**2 TO SUM-SQ.
În anii 1980, adăugarea de bucle în linie și declarații „structurate”, cum ar fi END-PERFORM, a dus la un buclă for -cu o structură mai familiară.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000
ADD I**2 TO SUM-SQ.
END-PERFORM
Dacă verbul PERFORM are clauza opțională TEST DUPĂ, bucla rezultată este ușor diferită: corpul buclei este executat cel puțin o dată, înainte de orice test.
1964: BAZIC
Buclele din BASIC sunt uneori numite bucle următoare.
10 REM THIS FOR LOOP PRINTS ODD NUMBERS FROM 1 TO 15
20 FOR I = 1 TO 15 STEP 2
30 PRINT I
40 NEXT I
Observați că marcatorul de buclă de sfârșit specifică numele variabilei index, care trebuie să corespundă cu numele variabilei index la începutul buclei for. Unele limbi (PL / I, FORTRAN 95 și versiunile ulterioare) permit o etichetă de declarație la începutul unei bucle for care poate fi asortată de compilator cu același text pe instrucțiunea de buclă finală corespunzătoare. Fortran permite, de asemenea, EXITși CYCLEdeclarațiilor să denumească acest text; într-un cuib de bucle, acest lucru arată clar care buclă este destinată. Cu toate acestea, în aceste limbi etichetele trebuie să fie unice, deci buclele succesive care implică aceeași variabilă index nu pot utiliza același text și nici o etichetă nu poate fi aceeași cu numele unei variabile, cum ar fi variabila index pentru buclă.
1964: PL / I
do counter = 1 to 5 by 1; /* "by 1" is the default if not specified */
/*statements*/;
end;
Instrucțiunea LEAVE poate fi utilizată pentru a ieși din buclă. Buclele pot fi etichetate, iar lăsarea poate lăsa o buclă specifică etichetată într-un grup de bucle imbricate. Unele dialecte PL / I includ instrucțiunea ITERATE pentru a termina iterația curentă a buclei și a începe următoarea.
1968: Algol 68
Algol 68 a ceea ce a fost considerat bucla universală, sintaxa completă este:
FOR i FROM 1 BY 2 TO 3 WHILE i≠4 DO ~ OD
Mai mult, intervalul de iterație unică ar putea fi înlocuit cu o listă de astfel de intervale. Există mai multe aspecte neobișnuite ale construcției
- numai
do ~ odporțiunea a fost obligatorie, caz în care bucla va itera la nesfârșit. - astfel clauza
to 100 do ~ odva itera exact de 100 de ori. whileelementul sintactică a permis un programator pentru a rupe dintr - oforbuclă mai devreme, la fel ca în:
INT sum sq := 0;
FOR i
WHILE
print(("So far:", i, new line)); # Interposed for tracing purposes. #
sum sq ≠ 70↑2 # This is the test for the WHILE #
DO
sum sq +:= i↑2
OD
Extensiile ulterioare la standardul Algol68 au permis ca toelementul sintactic să fie înlocuit cu uptoși downtosă realizeze o optimizare mică. Aceiași compilatori au încorporat, de asemenea:
until- pentru terminarea buclei târzii.
foreach- pentru lucrul la matrice în paralel .
1970: Pascal
for Counter := 1 to 5 do
(*statement*);
Decrementarea (numărarea înapoi) folosește downtocuvânt cheie în loc de to, ca în:
for Counter := 5 downto 1 do
(*statement*);
Intervalul numeric pentru buclă variază ceva mai mult.
1972: C / C ++
for (initialization; condition; increment/decrement)
statement
Declarația este de multe ori o declarație de bloc; un exemplu în acest sens ar fi:
//Using for-loops to add numbers 1 - 5
int sum = 0;
for (int i = 1; i < 6; ++i) {
sum += i;
}
Publicația ISO / IEC 9899: 1999 (cunoscută sub numele de C99 ) permite, de asemenea, declarații inițiale în forbucle. Toate cele trei secțiuni din bucla for sunt opționale.
1972: Smalltalk
1 to: 5 do: [ :counter | "statements" ]
Spre deosebire de alte limbi, în Smalltalk o buclă for nu este o construcție de limbaj, ci este definită în clasa Număr ca metodă cu doi parametri, valoarea finală și o închidere , folosind auto ca valoare de pornire.
1980: Ada
for Counter in 1 .. 5 loop
-- statements
end loop;
Instrucțiunea exit poate fi utilizată pentru a ieși din buclă. Buclele pot fi etichetate, iar ieșirea poate lăsa o buclă specificată într-un grup de bucle imbricate:
Counting:
for Counter in 1 .. 5 loop
Triangle:
for Secondary_Index in 2 .. Counter loop
-- statements
exit Counting;
-- statements
end loop Triangle;
end loop Counting;
1980: Arțar
Maple are două forme de buclă, una pentru iterarea unei game de valori, iar cealaltă pentru iterarea asupra conținutului unui container. Formularul intervalului de valori este după cum urmează:
for i from f by b to t while w do
# loop body
od;
Toate piesele, cu excepția doși odsunt opționale. Parte, dacă este prezent, trebuie să vină mai întâi. Piesele rămase ( , , , ) pot apărea în orice ordine.
for ifrom fby bto twhile w
Iterarea peste un container se face folosind această formă de buclă:
for e in c while w do
# loop body
od;
Clauza specifică containerului, care poate fi o listă, set, sumă, produs, funcția neevaluate, matrice, sau un obiect de punere în aplicare un iterator.
in c
O buclă pentru poate înceta od, endsau end do.
1982: Maxima CAS
În Maxima CAS se pot utiliza și valori care nu sunt întregi:
for x:0.5 step 0.1 thru 0.9 do
/* "Do something with x" */
1982: PostScript
Bucla for, scrisă ca [initial] [increment] [limit] { ... } forinițializează o variabilă internă, execută corpul atâta timp cât variabila internă nu depășește limita (sau nu mai mică, dacă incrementul este negativ) și, la sfârșitul fiecărei iterații, mărește variabila internă. Înainte de fiecare iterație, valoarea variabilei interne este împinsă pe stivă.
1 1 6 {STATEMENTS} for
Există, de asemenea, o repetare simplă. Bucla de repetare, scrisă ca X { ... } repeat, repetă corpul exact de X ori.
5 { STATEMENTS } repeat
1983: Ada 83 și mai sus
procedure Main is
Sum_Sq : Integer := 0;
begin
for I in 1 .. 9999999 loop
if Sum_Sq <= 1000 then
Sum_Sq := Sum_Sq + I**2
end if;
end loop;
end;
1984: MATLAB
for n = 1:5
-- statements
end
După buclă, nar fi 5 în acest exemplu.
Așa cum ise folosește pentru unitatea imaginară , este descurajată utilizarea acesteia ca variabilă de buclă.
1987: Perl
for ($counter = 1; $counter <= 5; $counter++) { # implicitly or predefined variable
# statements;
}
for (my $counter = 1; $counter <= 5; $counter++) { # variable private to the loop
# statements;
}
for (1..5) { # variable implicitly called $_; 1..5 creates a list of these 5 elements
# statements;
}
statement for 1..5; # almost same (only 1 statement) with natural language order
for my $counter (1..5) { # variable private to the loop
# statements;
}
(Rețineți că „ există mai multe modalități de a face acest lucru ” este un motto de programare Perl.)
1988: Mathematica
Construcția corespunzătoare buclei for a celor mai multe limbi se numește Do în Mathematica
Do[f[x], {x, 0, 1, 0.1}]
Mathematica are, de asemenea, o construcție For care imită bucla for a limbajelor asemănătoare cu C
For[x= 0 , x <= 1, x += 0.1,
f[x]
]
1989: Bash
# first form
for i in 1 2 3 4 5
do
# must have at least one command in loop
echo $i # just print value of i
done
# second form
for (( i = 1; i <= 5; i++ ))
do
# must have at least one command in loop
echo $i # just print value of i
done
Rețineți că o buclă goală (adică una fără comenzi între doși done) este o eroare de sintaxă. Dacă buclele de mai sus conțin doar comentarii, executarea ar duce la mesajul „eroare de sintaxă lângă simbolul neașteptat„ făcut ””.
1990: Haskell
Imperativul încorporat forM_ mapează o expresie monadică într-o listă, ca
forM_ [1..5] $ \indx -> do statements
sau obțineți fiecare rezultat de iterație ca listă în
statements_result_list <- forM [1..5] $ \indx -> do statements
Dar, dacă doriți să salvați spațiul listei [1..5], o construcție monadică mai autentică pentru Loop_ poate fi definită ca
import Control.Monad as M
forLoopM_ :: Monad m => a -> (a -> Bool) -> (a -> a) -> (a -> m ()) -> m ()
forLoopM_ indx prop incr f = do
f indx
M.when (prop next) $ forLoopM_ next prop incr f
where
next = incr indx
și folosit ca:
forLoopM_ (0::Int) (< len) (+1) $ \indx -> do -- whatever with the index
1991: Oberon-2, Oberon-07 sau Component Pascal
FOR Counter := 1 TO 5 DO
(* statement sequence *)
END
Rețineți că în limba originală Oberon bucla for a fost omisă în favoarea construcției buclei Oberon mai generale. For-loop a fost reintrodus în Oberon-2.
1991: Python
Python nu conține bucla clasică pentru, mai degrabă foreachse utilizează o buclă pentru a itera peste ieșirea range()funcției încorporate care returnează o listă iterabilă de numere întregi.
for i in range(1, 6): # gives i values from 1 to 5 inclusive (but not 6)
# statements
print(i)
# if we want 6 we must do the following
for i in range(1, 6 + 1): # gives i values from 1 to 6
# statements
print(i)
Utilizarea range(6)ar rula bucla de la 0 la 5.
1993: AppleScript
repeat with i from 1 to 5
-- statements
log i
end repeat
De asemenea, puteți itera printr-o listă de articole, similar cu ceea ce puteți face cu matricele în alte limbi:
set x to {1, "waffles", "bacon", 5.1, false}
repeat with i in x
log i
end repeat
De asemenea, puteți utiliza oricând exit repeatpentru a ieși dintr-o buclă. Spre deosebire de alte limbi, AppleScript nu are în prezent nicio comandă pentru a continua la următoarea iterație a unei bucle.
1993: Lua
for i = start, stop, interval do
-- statements
end
Deci, acest cod
for i = 1, 5, 2 do
print(i)
end
va imprima:
1 3 5
For-buclele pot, de asemenea, să treacă printr-un tabel folosind
ipairs()
să itereze numeric prin tablouri și
pairs()
pentru a itera aleatoriu prin dicționare.
Generic pentru buclă folosind închideri :
for name, phone, address in contacts() do
-- contacts() must be an iterator function
end
1995: CFML
Sintaxa scriptului
Buclă index simplă:
for (i = 1; i <= 5; i++) {
// statements
}
Folosind o matrice:
for (i in [1,2,3,4,5]) {
// statements
}
Folosind o listă de valori șir:
loop index="i" list="1;2,3;4,5" delimiters=",;" {
// statements
}
Exemplul de mai sus listeste disponibil numai în dialectul CFML folosit de Lucee și Railo .
Sintaxa etichetei
Buclă index simplă:
<cfloop index="i" from="1" to="5">
<!--- statements --->
</cfloop>
Folosind o matrice:
<cfloop index="i" array="#[1,2,3,4,5]#">
<!--- statements --->
</cfloop>
Folosind o „listă” de valori șir:
<cfloop index="i" list="1;2,3;4,5" delimiters=",;">
<!--- statements --->
</cfloop>
1995: Java
for (int i = 0; i < 5; i++) {
//perform functions within the loop;
//can use the statement 'break;' to exit early;
//can use the statement 'continue;' to skip the current iteration
}
Pentru bucla for extinsă, consultați bucla Foreach § Java .
1995: JavaScript
JavaScript acceptă bucle „cu trei expresii” în stil C. breakȘi continuesunt confirmate în interiorul bucle.
for (var i = 0; i < 5; i++) {
// ...
}
Alternativ, este posibil să iterați pe toate cheile unui tablou.
for (var key in array) { // also works for assoc. arrays
// use array[key]
...
}
1995: PHP
Aceasta imprimă un triunghi de *
for ($i = 0; $i <= 5; $i++) {
for ($j = 0; $j <= $i; $j++) {
echo "*";
}
echo "<br />\n";
}
1995: Ruby
for counter in 1..5
# statements
end
5.times do |counter| # counter iterates from 0 to 4
# statements
end
1.upto(5) do |counter|
# statements
end
Ruby are mai multe sintaxe posibile, inclusiv mostrele de mai sus.
1996: OCaml
Vezi sintaxa expresiei.
(* for_statement := "for" ident '=' expr ( "to" ∣ "downto" ) expr "do" expr "done" *)
for i = 1 to 5 do
(* statements *)
done ;;
for j = 5 downto 0 do
(* statements *)
done ;;
1998: ActionScript 3
for (var counter:uint = 1; counter <= 5; counter++){
//statement;
}
2008: Small Basic
For i = 1 To 10
' Statements
EndFor
2008: Nim
Nim are o foreachbuclă de tip și diverse operații pentru crearea iteratorilor.
for i in 5 .. 10:
# statements
2009: Du-te
for i := 0; i <= 10; i++ {
// statements
}
2010: Rugină
for i in 0..10 {
// statements
}
2012: Julia
for j = 1:10
# statements
end
