Ce face Operatori de comparație și logici (== && || ! ?:)
Operatorii de comparație (== != < <= > >=) și cei logici (&& || !) dau un int: 1 pentru adevărat, 0 pentru fals. În C, orice valoare diferită de 0 este considerată adevărată într-o condiție, iar 0 (și pointerul nul) este fals.
&& și || evaluează de la stânga la dreapta și se opresc când rezultatul este sigur (evaluare scurtcircuitată): în p != NULL && *p > 0, partea a doua nu rulează dacă p este nul. Așa scrii verificări sigure.
Operatorul condițional c ? a : b dă a dacă c este adevărat, altfel b. Este util pentru alegeri scurte, într-o singură expresie.
Exemple
Exemplul 1: Rezultatul unei comparații este 1 sau 0
#include <stdio.h>
int main(void) {
int nota = 7;
printf("nota >= 5: %d\n", nota >= 5);
printf("nota == 10: %d\n", nota == 10);
printf("!(nota == 10): %d\n", !(nota == 10));
return 0;
}
Rezultat
nota >= 5: 1
nota == 10: 0
!(nota == 10): 1
Exemplul 2: Condiții combinate: admis la examen
Elevul este admis dacă are media cel puțin 5 și prezența cel puțin 70%, sau dacă are scutire.
#include <stdio.h>
int main(void) {
double media = 6.5;
int prezenta = 65;
bool scutit = false;
bool admis = (media >= 5 && prezenta >= 70) || scutit;
printf("Admis: %s\n", admis ? "da" : "nu");
return 0;
}
Rezultat
Admis: nu
Exemplul 3: Scurtcircuitare: a doua condiție nu rulează
Pentru că stoc este 0, stoc > 0 este fals și verifica() nu mai este apelată. Același mecanism protejează împărțirea: n != 0 && total / n > 10.
#include <stdio.h>
bool verifica(void) {
printf("verifica() a fost apelată\n");
return true;
}
int main(void) {
int stoc = 0;
if (stoc > 0 && verifica()) {
printf("Produs disponibil\n");
} else {
printf("Stoc epuizat\n");
}
return 0;
}
Rezultat
Stoc epuizat
Greșeli frecvente
- Scrii
if (x = 5)în loc deif (x == 5). Prima formă atribuie 5 și condiția este mereu adevărată (clang avertizează cu-Wall). - Scrii
if (1 < x < 10). Se evaluează(1 < x) < 10, adică 0 sau 1 comparat cu 10, mereu adevărat. Corect:x > 1 && x < 10. - Încurci
&&cu&(ȘI pe biți).&nu se oprește devreme și compară biții, nu adevărul.
Comenzi înrudite
if / else: Execută un bloc de cod doar dacă o condiție este adevărată, cu ramuri alternative pentru celelalte cazuri.Operatori pe biți (& | ^ ~ << >>): Lucrează direct cu biții unui întreg: steaguri (flags), măști, deplasări; folosiți la permisiuni, protocoale și hardware.bool, true, false: Tipul pentru valori adevărat/fals. În C23, bool, true și false sunt cuvinte cheie, fără să mai incluzi stdbool.h.Operatori aritmetici (+ - * / % ++ --): Adunare, scădere, înmulțire, împărțire, restul împărțirii, atribuiri compuse și incrementare cu ++ / –.