Tipul logic

Bază~10 min11 pași

De ce contează?

Semaforul are exact două stări: roșu sau verde. Contul e activ sau blocat. Nu există o a treia opțiune. Tipul bool captează această realitate: doar true sau false, 1 sau 0. Orice condiție pe care o scrii într-un if sau while produce, în final, o valoare bool — de aceea merită să o înțelegi bine.

Ce este bool?

bool este tipul care stochează valori logice: true (adevărat) sau false (fals).

Intern, true = 1 și false = 0. Orice valoare nenulă convertită la bool devine true.

bool esteParit = true;
bool esteNegativ = false;

cout << esteParit   << endl;  // afiseaza 1
cout << esteNegativ << endl;  // afiseaza 0

Operatori de comparație

Produc o valoare bool:

OperatorSemnificațieExempluRezultat
==egal5 == 5true
!=diferit3 != 4true
<mai mic7 < 3false
>mai mare7 > 3true
<=mai mic sau egal5 <= 5true
>=mai mare sau egal4 >= 6false

Operatori logici

Combină condiții bool:

OperatorSemnificațieRegulă
&&ȘI logic (AND)true doar dacă AMBII sunt true
||SAU logic (OR)true dacă CEL PUȚIN UNul e true
!NEGAȚIEinversează: !true = false
int x = 7;
bool inInterval = (x > 0) && (x < 10);  // true -- 7 e intre 1 si 9
bool parSauMic  = (x % 2 == 0) || (x < 5);  // false -- nici par, nici < 5
bool niciParar  = !(x % 2 == 0);  // true -- x e impar
Observația-cheie

&& și || folosesc evaluare leneșă (short-circuit): dacă primul operand al && e false, al doilea nu mai e evaluat — rezultatul e oricum false. La ||, dacă primul e true, al doilea se sare. Asta contează când al doilea operand ar putea provoca un crash (ex: împărțire la zero): n != 0 && 10/n > 2 e sigur, 10/n > 2 && n != 0 nu e.

Exemplu complet

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    bool estePar     = (n % 2 == 0);
    bool estePozitiv = (n > 0);
    bool esteParSiPozitiv = estePar && estePozitiv;

    if (esteParSiPozitiv) {
        cout << n << " este par si pozitiv" << endl;
    } else {
        cout << n << " nu indeplineste ambele conditii" << endl;
    }
    return 0;
}
Indiciu

Poți afișa bool ca text cu boolalpha: cout << boolalpha << true; afișează true în loc de 1. Util la debug, nu la concursuri.

Greșeli frecvente

Greșeala 1: Scrii = în loc de == într-o condiție. if (x = 5) atribuie 5 lui x și condiția e mereu true. Compilatorul poate avertiza, dar nu refuză compilarea — bug-ul rămâne silențios.

Greșeala 2: Confunzi & (AND pe biți) cu && (AND logic). Pentru valorile 0/1 produc același rezultat, dar & nu face short-circuit și pentru valori nenule poate da rezultate diferite de &&.

Greșeala 3: Compari numere reale cu ==. 0.1 + 0.2 == 0.3 e false din cauza erorilor de reprezentare în virgulă mobilă. Compară cu o toleranță: fabs(a - b) < 1e-9.

Întrebarea 1 / 3

Ce valoare are expresia: (3 > 5) || (2 < 10)?