C/Blocchi e funzioni/Operatori logici

Indice del libro

Per una definizione di verità e falsità in C, vedere Verità e falsità in C. Gli operatori logici nel linguaggio C sono:

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.

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

risultato = true && false; // Restituirà false o 0

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 != .

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.

Questo operatore ritorna vero se le due espressioni sono diverse.

Valutazione "short-circuit"

modifica

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).