- Programmazione » Programmazione » Guida C - Manuale programmazione con articoli e risorse interessanti
Gli operatori: Operatori logici di test
Operatori logici di test
Gli operatori logici di test possono essere suddivisi in due gruppi: quelli normalmente usati nei confronti tra valori e quelli utilizzati per collegare i risultati di due confronti. Ecco una breve serie di esempi relativi al primo gruppo:
(a == b) // VERA se a e' UGUALE a b (a != b) // VERA se a e' diversa da b (a < b) // VERA se a e' strettamente minore di b (a > b) // VERA se a e' strettamente maggiore di b (a <= b) // VERA se a e' minore o uguale a b (a >= b) // VERA se a e' maggiore o uguale a b
La grafia di detti operatori ed il loro significato appaiono scontati, ad eccezione, forse, dell'operatore di uguaglianza "==": in effetti i progettisti del C, constatato che nella codifica dei programmi i confronti per uguaglianza sono, generalmente, circa la metà degli assegnamenti, hanno deciso[7] di distinguere i due operatori "raddoppiando" la grafia del secondo per esprimere il primo. Ne segue che
a = b;
assegna ad a il valore di b, mentre
(a == b)
esprime una condizione che è vera se le due variabili sono uguali. La differente grafia dei due operatori consente di mortificare, ancora una volta, la povera regola KISS, rendendo possibile scrivere condizioni come
if(a = b) ....
Per quanto appena detto, è ovvio che tale scrittura non può significare "se a è uguale a b": si tratta infatti, in realtà, di un modo estremamente succinto per dire
a = b;
if(a) ....
che, a sua volta, equivale a
a = b;
if(a != 0) ....
cioè "assegna b ad a, e se il
risultato (cioè il nuovo valore di a)
è diverso da 0..." , dal momento che il
C, ogni qualvolta sia espressa una condizione senza secondo
termine di confronto assume che si voglia verificane la
nonnullità. Carino, vero?
Veniamo al secondo gruppo. Gli operatori logici normalmente
usati per collegare i risultati di due o più confronti
sono due: si tratta del prodotto logico
("&&" , o and) e della
somma logica ("||" , o
or).
(a < b && c == d) // AND: vera se entrambe sono VERE (a < b || c == d) // OR: vera se ALMENO UNA e' VERA
E' possibile scrivere condizioni piuttosto complesse, ma vanno tenute presenti le regole di precedenza ed associatività. Ad esempio, poiché tutti gli operatori del primo gruppo hanno precedenza maggiore di quelli del secondo, la
(a < b && c == d)
è equivalente alla
((a < b) && (c == d)
Nelle espressioni in cui compaiono sia "&&" che "||" va ricordato che il primo ha precedenza rispetto al secondo, perciò
(a < b || c == d && d > e)
equivale a
((a < b) || ((c == d) && (d > e)))
Se ne trae, se non altro, che in molti casi usare le parentesi, anche quando non indispensabile, è sicuramente utile, dal momento che incrementa in misura notevole la leggibilità del codice e abbatte la probabilità di commettere subdoli errori logici.
- Articolo precedente Gli operatori: Shift su bit
- Articolo successivo Gli operatori: Operatori logici su bit