O expresie logică este o expresie care are valoarea „adevărat” sau „fals”. În C++, adevărat înseamnă 1 (sau orice valoare nenulă), iar fals înseamnă 0. Expresiile logice controlează fiecare if, while și for, iar la BAC informatică apar direct în grilele de la Subiectul I și indirect în toate algoritmii de la Subiectul II.

Operatorii relaționali și logici în C++

Operatorii relaționali compară două valori: <, <=, >, >=, == (egal) și != (diferit). Operatorii logici combină condiții:

C++PseudocodValoare
a && ba și b1 doar dacă ambele sunt adevărate
a || ba sau b1 dacă măcar una este adevărată
!anegația lui a1 dacă a este fals, 0 dacă a este adevărat

În pseudocod egalitatea se scrie cu un singur =, iar diferit cu ≠. În C++, = este atribuire: if (x = 5) se compilează, pune 5 în x și este mereu adevărat. E una dintre cele mai scumpe greșeli de traducere.

Precedența operatorilor

Ordinea de evaluare, de la prioritatea cea mai mare la cea mai mică, pentru operatorii care contează la BAC:

  1. ! (și ceilalți operatori unari, de exemplu minusul unar)
  2. *, /, %
  3. +, -
  4. <, <=, >, >=
  5. ==, !=
  6. &&
  7. ||
  8. = și atribuirile compuse

Două consecințe importante. Prima: && are prioritate mai mare decât ||, deci a || b && c înseamnă a || (b && c). A doua: ! se aplică doar operandului imediat următor, deci !x == 5 înseamnă (!x) == 5, nu „x diferit de 5”. Când nu ești sigur, pune paranteze — nu se depunctează niciodată o paranteză în plus.

Capcana a < x < b

La matematică scrii 10 ≤ x ≤ 20. În C++, 10 <= x <= 20 este acceptat de multe compilatoare (cel mult cu un avertisment), dar înseamnă (10 <= x) <= 20: prima comparație dă 0 sau 1, iar 0 sau 1 este mereu cel mult 20. Expresia este deci mereu adevărată. Exemplu de grilă: 5 < 3 < 2 are valoarea 1, pentru că 5 < 3 este 0, iar 0 < 2 este 1.

Formele corecte:

Evaluarea scurtcircuitată

C++ evaluează && și || de la stânga la dreapta și se oprește imediat ce rezultatul e sigur. La a && b, dacă a e fals, b nu se mai evaluează. La a || b, dacă a e adevărat, b nu se mai evaluează.

Asta te protejează în situații reale:

// sigur: dacă y este 0, împărțirea nu se mai face
if (y != 0 && x % y == 0)
    cout << "divizibil";

// sigur: nu se citește v[n] dacă i a ajuns la n
while (i < n && v[i] != x)
    i++;

Dacă inversezi ordinea condițiilor în al doilea exemplu, programul poate accesa un element din afara vectorului. Ordinea operanzilor contează.

Legile lui De Morgan: cum negi corect o condiție

Negarea unei condiții compuse este operația pe care o faci de fiecare dată când transformi un cât timp într-un repetă … până când. Regulile sunt:

!(a && b)  este echivalent cu  !a || !b
!(a || b)  este echivalent cu  !a && !b

Pe scurt: negația „intră” în paranteză, fiecare condiție se neagă, iar && devine || și invers. Negațiile operatorilor relaționali:

CondițieNegația
x < yx >= y
x <= yx > y
x == yx != y
x % 2 == 0x % 2 != 0

Exemplu din Subiectul II: algoritmul conține cât timp x>0 și y%2=0 execută. Ca să-l rescrii cu repetă … până când, condiția de oprire este negația: până când x≤0 sau y%2≠0. Greșeala tipică este să negi doar operatorii relaționali și să lași „și” neschimbat.

Exemple rezolvate de tip grilă

1. Pentru x = 7 și y = 3, ce valoare are !(x < y) && (x % y == 1 || y > 5)?

x < y este 0, deci !(x < y) este 1. x % y este 1, deci x % y == 1 este 1 și paranteza a doua este 1 fără să mai conteze y > 5. Rezultat: 1.

2. Scrie o expresie care are valoarea 1 dacă și numai dacă numărul natural x are exact două cifre.

Variante corecte: x >= 10 && x <= 99 sau x / 10 != 0 && x / 100 == 0. Verificare pe valori-limită: pentru 5, 5 / 10 este 0, deci fals; pentru 42, 4 este nenul și 0 este 0, deci adevărat; pentru 150, 150 / 100 este 1, deci fals.

3. Un an este bisect dacă se divide cu 4 și nu se divide cu 100, sau dacă se divide cu 400:

(a % 4 == 0 && a % 100 != 0) || a % 400 == 0

Pentru 1900: se divide cu 4 și cu 100, deci prima paranteză e falsă; 1900 % 400 = 300, deci și a doua parte e falsă: nu e bisect. Pentru 2000: prima paranteză e falsă, dar 2000 % 400 = 0, deci e bisect. Pentru 2024: prima paranteză e adevărată.

4. Care este negația expresiei x >= 10 && x <= 99? Aplicând De Morgan: x < 10 || x > 99, adică „x nu are exact două cifre”.

La BAC: la grilele de tipul „dacă și numai dacă”, nu încerca să demonstrezi echivalența. Testează fiecare variantă pe 3–4 valori alese strategic: o valoare din interior, valorile-limită și o valoare din afară. Varianta greșită pică aproape întotdeauna la una dintre limite.

De reținut