Operatori de comparație și logici (== && || ! ?:) în C

Operatori C89

Compară valori și combină condiții: rezultatul este 1 (adevărat) sau 0 (fals); && și || se opresc cât mai devreme.

Sintaxă
a == b   a != b   a < b   a <= b   a > b   a >= b
conditie1 && conditie2
conditie1 || conditie2
!conditie
conditie ? valoare_da : valoare_nu

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 de if (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 ++ / –.