if, else în C++

Structuri de control C++98 (if cu inițializare: C++17)

Execută un bloc de cod doar dacă o condiție este adevărată; else oferă varianta pentru cazul contrar.

Sintaxă
if (conditie) {
    ...
} else if (alta_conditie) {
    ...
} else {
    ...
}
if (auto x = calcul(); x > 0) { ... }   // C++17

Ce face if, else

if evaluează condiția dintre paranteze. Dacă este adevărată (true sau un număr diferit de 0), se execută blocul dintre acolade. Altfel, se execută blocul de după else, dacă există. Cu else if poți înlănțui mai multe condiții; se execută doar prima ramură adevărată.

Din C++17, if poate avea o inițializare înainte de condiție, separată prin ;. Variabila declarată acolo există doar în interiorul lui if și else, ceea ce ține codul curat.

Pentru o alegere simplă între două valori există operatorul ternar: conditie ? valoare_da : valoare_nu.

Exemple

Exemplul 1: Calificativul după notă

#include <print>

void calificativ(int nota) {
    if (nota >= 9) {
        std::println("{}: Foarte bine", nota);
    } else if (nota >= 7) {
        std::println("{}: Bine", nota);
    } else if (nota >= 5) {
        std::println("{}: Suficient", nota);
    } else {
        std::println("{}: Insuficient", nota);
    }
}

int main() {
    calificativ(10);
    calificativ(7);
    calificativ(4);
}

Rezultat

10: Foarte bine
7: Bine
4: Insuficient

Exemplul 2: if cu inițializare (C++17)

it este vizibil doar în if și în else, deci nu „poluează” restul funcției.

#include <map>
#include <print>
#include <string>

int main() {
    std::map<std::string, double> preturi = {{"pâine", 4.5}, {"lapte", 7.2}};
    for (const std::string produs : {"lapte", "cafea"}) {
        if (auto it = preturi.find(produs); it != preturi.end()) {
            std::println("{} costă {} lei", produs, it->second);
        } else {
            std::println("{} nu este în listă", produs);
        }
    }
}

Rezultat

lapte costă 7.2 lei
cafea nu este în listă

Exemplul 3: Operatorul ternar

#include <print>

int main() {
    int bucati = 1;
    std::println("Ai {} {}", bucati, bucati == 1 ? "produs" : "produse");
    bucati = 3;
    std::println("Ai {} {}", bucati, bucati == 1 ? "produs" : "produse");
}

Rezultat

Ai 1 produs
Ai 3 produse

Greșeli frecvente

  • Scrii if (x = 5) în loc de if (x == 5). Atribuirea face condiția mereu adevărată și schimbă x.
  • Pui punct și virgulă după condiție: if (stoc > 0); { ... }. ; este un bloc gol, deci acoladele se execută întotdeauna.
  • Omiți acoladele și adaugi mai târziu o a doua linie. Doar prima linie ține de if; cealaltă se execută mereu. Pune acolade întotdeauna.

Comenzi înrudite

  • switch, case, default: Alege una dintre mai multe ramuri după valoarea unei expresii întregi, a unui caracter sau a unui enum.
  • if constexpr: Un if evaluat la compilare: ramura falsă este eliminată complet, deci poate conține cod care nu s-ar compila pentru tipul curent.
  • bool, true, false: Tipul logic: o variabilă bool are doar două valori, true (adevărat) sau false (fals).
  • and, or, not și ceilalți operatori alternativi: Cuvinte care pot înlocui simbolurile unor operatori: and pentru &&, or pentru ||, not pentru !, bitand pentru & și altele.