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++ | Pseudocod | Valoare |
|---|---|---|
a && b | a și b | 1 doar dacă ambele sunt adevărate |
a || b | a sau b | 1 dacă măcar una este adevărată |
!a | negația lui a | 1 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:
!(și ceilalți operatori unari, de exemplu minusul unar)*,/,%+,-<,<=,>,>===,!=&&||=ș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:
- x aparține intervalului [a, b]:
x >= a && x <= b - x nu aparține intervalului [a, b]:
x < a || x > b
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ție | Negația |
|---|---|
x < y | x >= y |
x <= y | x > y |
x == y | x != y |
x % 2 == 0 | x % 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”.
De reținut
- ● Adevărat = 1, fals = 0; orice valoare nenulă este considerată adevărată.
- ● Prioritate:
!, aritmetici, relaționali,==/!=,&&,||. - ●
a < x < bnu înseamnă ce pare; scriex > a && x < b. - ●
&&și||se opresc din evaluare imediat ce rezultatul e sigur. - ● De Morgan:
!(a && b) = !a || !bși!(a || b) = !a && !b.