C/Blocchi e funzioni/Operatori logici
Per una definizione di verità e falsità in C, vedere Verità e falsità in C. Gli operatori logici nel linguaggio C sono:
NOT !
[modifica | modifica sorgente]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.
risultato = !true; // Restituirà false o 0
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
risultato = !2;
è corretto e dà come risultato 0.
AND &&
[modifica | modifica sorgente]Questo operatore restituisce true se entrambe le espressioni sono vere, false altrimenti.
risultato = true && false; // Restituirà false o 0
OR ||
[modifica | modifica sorgente]Questo operatore restituisce true se almeno una delle due espressioni è vera, false altrimenti.
risultato = true || false; // Restituirà true o 1
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 != .
==
[modifica | modifica sorgente]Questo operatore ritorna vero se le due espressioni sono uguali.
c = a == b; // Restituirà true se a e b sono uguali, altrimenti false
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:
if(scelta = 3)
printf("Hai scelto la terza scelta.\n");
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.
!=
[modifica | modifica sorgente]Questo operatore ritorna vero se le due espressioni sono diverse.
Valutazione "short-circuit"
[modifica | modifica sorgente]Una caratteristica notevole degli operatori logici && e || è che essi valutano solo gli operandi effettivamente necessari a determinare il risultato.
risultato = f(a) && g(++b); // se f(a) == false , g(++b) non sarà valutata
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
).