for în C++

Bucla cu contor: repetă un bloc de cod cât timp condiția este adevărată, cu inițializare și pas scrise pe același rând.

Sintaxă
for (inițializare; condiție; pas) {
    ...
}

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 de i < v.size(). Ultimul pas citește v[v.size()], în afara vectorului: comportament nedefinit.
  • Compari un int cu v.size() (care e fără semn). Primești avertismentul -Wsign-compare; folosește std::size_t sau 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.