Barninga Z
a- a+

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 non­nullità. 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. 

 



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Graziano
Hai qualche domanda da fare?