# C/Blocchi e funzioni/Operatori logici

C
Copertina Tutti i moduli · Sviluppo
* LinguaggioC/Linguaggio
** PanoramicaC/Linguaggio/Panoramica
** Struttura del linguaggioC/Linguaggio/Struttura del linguaggio
* Variabili, operatori e costantiC/Variabili, operatori e costanti
** VariabiliC/Variabili, operatori e costanti/Variabili
** Operatori aritmeticiC/Variabili, operatori e costanti/Operatori aritmetici
** Operatori sui bitC/Variabili, operatori e costanti/Operatori sui bit
** CostantiC/Variabili, operatori e costanti/Costanti
* Blocchi e funzioniC/Blocchi e funzioni
** Blocchi if e switchC/Blocchi e funzioni/Blocchi if e switch
** Operatori logiciC/Blocchi e funzioni/Operatori logici
** CicliC/Blocchi e funzioni/Cicli
** FunzioniC/Blocchi e funzioni/Funzioni
** mainC/Blocchi e funzioni/main
** LibrerieC/Blocchi e funzioni/Librerie
** RicorsivitàC/Blocchi e funzioni/Ricorsività
* Vettori e puntatoriC/Vettori e puntatori
** VettoriC/Vettori e puntatori/Vettori
** PuntatoriC/Vettori e puntatori/Puntatori
** Interscambiabilità tra puntatori e vettoriC/Vettori e puntatori/Interscambiabilità tra puntatori e vettori
* StringheC/Variabili, operatori e costanti/Stringhe
* Enumerazioni, strutture e unioniC/Enumerazioni, strutture e unioni
** EnumerazioniC/Enumerazioni, strutture e unioni/Enumerazioni
** StruttureC/Enumerazioni, strutture e unioni/Strutture
** UnioniC/Enumerazioni, strutture e unioni/Unioni
* Conversioni di tipoC/Conversioni di tipo
* Lettura e scrittura su fileC/Lettura e scrittura su file
** File di TestoC/Lettura e scrittura su file/File di Testo
** File BinariC/Lettura e scrittura su file/File Binari
* Compilatore e precompilatoreC/Compilatore e precompilatore
** CompilatoreC/Compilatore e precompilatore/Compilatore
** DirettiveC/Compilatore e precompilatore/Direttive
** HeaderC/Compilatore e precompilatore/Header
* VisibilitàC/Visibilità
* Gestione della memoriaC/Gestione della memoria
* Le applicazioni CGIC/Le applicazioni CGI
* Appendice
** Librerie standardC/Appendice/Librerie standard
*** assert.hC/Appendice/Librerie standard/assert.h
*** ctype.hC/Appendice/Librerie standard/ctype.h
*** errno.hC/Appendice/Librerie standard/errno.h
*** float.hC/Appendice/Librerie standard/float.h
*** limits.hC/Appendice/Librerie standard/limits.h
*** locale.hC/Appendice/Librerie standard/locale.h
*** math.hC/Appendice/Librerie standard/math.h
*** setjmp.hC/Appendice/Librerie standard/setjmp.h
*** signal.hC/Appendice/Librerie standard/signal.h
*** stdarg.hC/Appendice/Librerie standard/stdarg.h
*** stddef.hC/Appendice/Librerie standard/stddef.h
*** stdio.hC/Appendice/Librerie standard/stdio.h
*** stdlib.hC/Appendice/Librerie standard/stdlib.h
*** string.hC/Appendice/Librerie standard/string.h
*** time.hC/Appendice/Librerie standard/time.h
** StrumentiC/Appendice/Strumenti
*** InstallerC/Appendice/Strumenti/Installer
** Librerie esterneC/Appendice/Librerie esterne
* Bibliografia
    IndiceC/Indice
Modifica il sommario
Per una definizione di verità e falsità in C, vedere Verità e falsità in C. Gli operatori logici nel linguaggio C sono:

## NOT !

Questo operatore inverte il risultato di un'espressione: ovvero se essa restituisce true restituirà false o viceversa. Negli esempi si ipotizzi incluso il file stdbool.h che definisce le macro true e false.
Precisamente, prima dell'introduzione dei booleani con lo standard ISO C99, l'operatore ! era progettato per restituire uno se il suo operando è zero e zero se il suo operando ha un qualsiasi valore diverso da 0. Quindi fare
è corretto e dà come risultato 0.

## AND &&

Questo operatore restituisce true se entrambe le espressioni sono vere, false altrimenti.

## OR ||

Questo operatore restituisce true se almeno una delle due espressioni è vera, false altrimenti.
Il linguaggio C non possiede l'operatore XOR. Tuttavia è provvisto dell'operatore ^, XOR bitwise. Ad ogni modo, l'operatore XOR non ha alcun senso in quanto equivale all'operatore != .
Questo operatore ritorna vero se le due espressioni sono uguali.
Come si vede nell'esempio appena indicato, è facile confondere l'operatore = e l'operatore == . Ciò è un doppio errore per via del suo side effect. Ecco un esempio:
Se si compila il programma, si vedrà che il blocco if sarà sempre soddisfatto in quanto l'esecuzione di scelta = 3 comporta che:
* Si assegni a scelta il valore 3
* Si restituisca il valore 3, successivamente valutato da if.
La condizione è considerata soddisfatta se è vera, ed è vera se è diversa da 0 (e 3 è diverso da 0), quindi il blocco è sempre eseguito.
Ad ogni modo, molti compilatori possono mandare messaggi di Warning per scongiurare il problema.
Questo operatore ritorna vero se le due espressioni sono diverse.

## Valutazione "short-circuit"

Una caratteristica notevole degli operatori logici && e || è che essi valutano solo gli operandi effettivamente necessari a determinare il risultato.
Nell'esaminare questa espressione, verrà prima di tutto valutata f(a). Se l'espressione f(a) risulta in un valore di falsità, g non sarà neppure richiamata (né sarà incrementata b).