Ce face for
for are trei părți separate prin ;: inițializarea (rulată o dată, la început), condiția (verificată înainte de fiecare pas) și pasul (rulat după fiecare trecere). Bucla se oprește când condiția devine falsă.
Variabila declarată în inițializare (int i = 0) există doar în buclă. Oricare dintre cele trei părți poate lipsi: for (;;) este o buclă infinită, oprită din interior cu break sau return.
Pentru a parcurge toate elementele unei colecții, forma modernă este bucla range-for: for (int x : v).
Exemple
Exemplul 1: Numărare și sumă
#include <print>
int main() {
int suma = 0;
for (int i = 1; i <= 5; ++i) {
std::print("{} ", i);
suma += i;
}
std::println("\nSuma: {}", suma);
for (int i = 10; i > 0; i -= 3) {
std::print("{} ", i);
}
std::println("");
}
Rezultat
1 2 3 4 5
Suma: 15
10 7 4 1
Exemplul 2: Bucle imbricate: tabla înmulțirii
#include <print>
int main() {
for (int i = 1; i <= 4; ++i) {
for (int j = 1; j <= 4; ++j) {
std::print("{:4}", i * j);
}
std::println("");
}
}
Rezultat
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
Exemplul 3: Parcurgere cu index și două variabile
Indexul este util când ai nevoie de poziție. Folosește std::size_t pentru index ca să nu compari un număr cu semn cu size(). În a doua buclă, două variabile se apropie din capete opuse.
#include <cstddef>
#include <print>
#include <string>
#include <vector>
int main() {
std::vector<std::string> clasament = {"Ana", "Mihai", "Ioana"};
for (std::size_t i = 0; i < clasament.size(); ++i) {
std::println("Locul {}: {}", i + 1, clasament[i]);
}
std::string cuvant = "capac";
bool palindrom = true;
for (std::size_t st = 0, dr = cuvant.size() - 1; st < dr; ++st, --dr) {
if (cuvant[st] != cuvant[dr]) palindrom = false;
}
std::println("{} este palindrom: {}", cuvant, palindrom);
}
Rezultat
Locul 1: Ana
Locul 2: Mihai
Locul 3: Ioana
capac este palindrom: true
Greșeli frecvente
- Scrii
i <= v.size()în loc dei < v.size(). Ultimul pas citeștev[v.size()], în afara vectorului: comportament nedefinit. - Compari un
intcuv.size()(care e fără semn). Primești avertismentul-Wsign-compare; foloseștestd::size_tsau bucla range-for. - Modifici vectorul (
push_back,erase) în timp ce îl parcurgi cu iteratori. Iteratorii pot deveni invalizi; folosește indici sau construiește un vector nou.
Comenzi înrudite
range-for (for (x : colecție)): Parcurge pe rând toate elementele unei colecții (vector, tablou, string, map) fără index și fără iteratori scriși de mână.while: Repetă un bloc de cod cât timp condiția este adevărată; condiția este verificată înainte de fiecare trecere.do ... while: Buclă care execută blocul cel puțin o dată și abia apoi verifică condiția.break, continue: break oprește imediat bucla sau switch-ul curent; continue sare peste restul pasului curent și trece la următorul.