Un Approccio a Java: Operatori Booleani

Operazioni tra variabili booleane



La volta precedente, abbiamo ampiamente parlato delle variabili booleane, cercando di delineare quali siano le principali operazioni che si possono effettuare proprio a livello pratico. 

Di tutti i casi esaminati, non abbiamo esaminato quello più importante e più ricorrente: il caso in cui le condizioni da esaminare siano più di una e, soprattutto, quando esiste una qualche relazione tra di loro.

Per risolvere queste situazioni, George Boole nel 1847 idea un tipo di algebra che comunemente viene chiamata algebra booleana. Nella letteratura, con algebra booleana si intende l'algebra in cui i valori, detti valori di verità, possono assumere solo i valori "vero" o "falso", denotati rispettivamente anche con 1 e 0.  Si può notare subito che le entità "protagoniste" dell'algebra di Boole sono quelle che abbiamo definito variabili booleane. 

Operatori booleani

Come nell'algebra tradizionale, anche nell'algebra booleana è stato necessario definire degli operatori per poter effettuare le operazioni tra valori di verità. 

Prima di iniziare la disamina dei tre opratori fondamentali, è bene introdurre un nuovo termine. Definiamo congiunto ogni membro di un'espressione logica.

And - prodotto logico

La prima operazione che esaminiamo è quelal del prodotto logico

La situazione è quella in cui vogliamo controllare che due o più condizioni siano vere allo stesso momento. Si vuole quindi verificare che una serie di condizioni si sia verificata. L'operatore and restituirà quindi true se tutti i congiunti della condizione sono veri contemporaneamente. 

Il comportamento di un operatore logico può essere riassunto attraverso una tabella a doppia entrata. Vediamo quindi come si comporta l'operatore and con due variabili. 

A B A and B
true true true
true false false
false true false
false false false

Da questa tabella si può evincere il comportamento a cui si accennava prima. Il risultato dell'and tra due variabili ha come risultato true se e solo se entrambi i congiunti hanno il valore di verità true.

L'operatore and gode anche di diverse proprietà. Di seguito elencherò solo quelle utili ed essenziali per sviluppare codice funzionante:

  • commutativa: A and B = B and A. Banalmente, significa che l'ordine con cui eseguiamo la congiunzione logica (modo alternativo di chiamare l'and) è irrilevante;
  • associativa: A and (B and C) = (A and B) and C. Questa proprietà ci dice che in qualsiasi modo effettuiamo una serie di congiunzioni, il risultato sarà sempre equivalente. 

La sintassi in Java utile per esprimere questo operatore è la seguente:

condizione1 && condizione2 && ... && condizionen

Vediamo quindi che in Java, l'operatore and è esprimibile così: &&.

Vediamo un semplice esempio

int a = 5;
int b = 7;
if(a > 3 && b < 10){
...
}

In questo particolare caso, abbiamo due congiunti che sono a > 3 b < 10. Valutandoli separatamente otteniamo che entrambi sono true. Otteniamo quindi un'espressione del tipo true and true, che restituisce true.

Operatore OR - somma logica

Il secondo operatore fondamentale dell'algebra booleana è l'operatore or, detto anche somma logica o disgiunzione logica. 

La disgiunzione logica restituisce il valore true se e solo se almeno uno dei congiunti è vero. Quindi, nel momento in cui ci si trova a dover valutare una condizione del tipo condizione1 or condizione2 or ... or condizioneN, avremo come risultato true se e solo se almeno una delle condizioni è vera.

Analizziamo la tabella di verità dell'operatore.

A B A or B
true  true true
true false true
false true true
false false false

 Da questa tabella notiamo proprio come quanto detto prima, sia vero. La disgiunzione logica di due o più operandi è vera se e solo se almeno uno dei congiunti è vero.

Così come la and, anche la or ha qualche proprietà che può risultare utile ai fini dello sviluppo. Vediamone un paio:

  • commutativa: questa proprietà è analoga a quella del prodotto logico. Ci dice che A or B = B or A.
  • associativa: ci dice che A or (B or C) = (A or B) or C. Volendo leggerla con un linguaggio naturale, ci dice che possiamo associare in qualsiasi modo i congiunti ed effettuare le disgiunzioni, ottenendo un risultato equivalente.

Questo operatore può essere espresso mediante il seguente operatore: ||.

Vediamo un esempio analogo al precedente.

int a = 5;
int b = 7;
if(a > b || b < 10){
... 
}

In questo caso, la valutazione della condizione restituisce vero, nonostante ci sia uno dei due congiunti falso. Infatti, a non è maggiore di b. Nonostante ciò, il secondo congiunto è vero, quindi tutta la disgiunzione è vera, in quanto riconducibile ad un espressione del tipo false or true, che restituisce true.

Operatore NOT - negazione logica

Questo è l'ultimo operatore di base ed è l'unico che in qualche maniera abbiamo già visto. L'operatore not, fondamentalmente, funge da invertitore. Nel momento in cui ha come ingresso true, restituisce false e viceversa.

Vediamo la tabella di verità della negazione logica.

A NOT A
true false
false true

Ora possiamo finalmente capire la notazione data la scorsa volta, che per comodità riporto qui di seguito.

Prima però dobbiamo sapere la sintassi da usare per esprimere l'operatore not. Ebbene, abbiamo già visto questa sintassi, che utilizza l'operatore ! (punto esclamativo).

int a = 5;
boolean condizione = a < 3;
if(!condizione){
	...
}

Riusciamo finalmente a comprendere il significato di quanto scritto. La condizione dell'if verrà tradotta come

if(!false)

Dalla tabella data prima, si può notare che !false = true. Otteniamo quindi un codice come 

if(true)

che è una scrittura valida e funzionante.

Ordine di valutazione lazy

Abbiamo introdotto i tre principali operatori logici. Per concludere questa prima carrellata, è bene introdurre un ultimo concetto, che è quello di ordine di valutazione lazy. Lazy, letteralmente, significa "pigro". 

Questo significa che, quando una and o una or vengono valutate, viene utilizzata una tecnica tale per cui il numero di congiunti valutati sia il minimo. Vediamo meglio:

  • valutazione lazy della congiunzione logica: il prodotto logico (and) viene valutato sino a quando i congiunti esaminati sono true. Nel momento in cui si trova un congiunto false, la valutazione dell'intera condizione viene interrotta.
  •  valutazione lazy della disgiunzione logica: la disgiunzione logica (or) viene valutata sino a quando si trova un congiunto true. Nel momento in cui si trova un congiunto vero, la valutazione viene interrotta e l'intera condizione viene valutata come vera.

Questo ci fa capire che, nel momento in cui abbiamo molte condizioni in and tra di loro, è bene scrivere all'inizio quelle che con una maggiore probabilità saranno false, in modo da evitare lunghe valutazioni. Al contrario, con le disgiunzioni, è preferibile scrivere per prime le condizioni che con una maggiore probabilità saranno true.

 
by Alessio Mungelli Date: 19-10-2020 jdk jre java sviluppo programmazione tutorial algebra booleana operatori logici and or not visite : 493  
 
Alessio Mungelli

Alessio Mungelli

Computer Science student at UniTo (University of Turin), Network specializtion, blogger and writer. I am a kind of expert in Java desktop developement with interests in AI and web developement. Unix lover (but not Windows hater). I am interested in Linux scripting. I am very inquisitive and I love learning new stuffs.

 
 
 

Articoli correlati

I migliori trucchi e le migliori caratteristiche per padroneggiare la vostra Smart TV Android

In questo articolo vi mostriamo una raccolta dei migliori trucchi per spremere Android TV, il sistema operativo di Google progettato per i televisori. Lo potete trovare sui televisori intelligenti di…

Un approccio a Java: Il ciclo while

Ciao a tutti e bentornati! Dopo aver fatto una breve, ma corposa, introduzione sui cicli, andiamo oggi a vedere finalmente le prime implementazioni che utilizzano quello che abbiamo definito ciclo precondizionale. In Java, come…

Un approccio a Java: I cicli - Introduzione

Ciao a tutti e bentornati! Sino ad ora, abbiamo parlato di variabili e di strutture di selezione, andando a considerare alcuni degli aspetti fondamentali di questi due concetti. Teoricamente, per…

Un approccio a Java: strutture di selezione - casi d'uso

Ciao a tutti e bentornati! Sino ad ora ci siamo preoccupati di fare una carrellata quanto più completa riguardo i concetti fondamentali di cui abbiamo bisogno per approcciarci all'utilizzo delle…

Un approccio a Java: le variabili booleane

Ciao a tutti e bentornati! La volta precedente, ho fatto un'introduzione alle strutture condizionali, definendo il loro funzionamento. Prima di poter dare qualche esempio pratico, è necessario chiarire in che modo ci…

Un approccio a Java: strutture condizionali

Ciao a tutti e bentornati! Le volte precedenti abbiamo introdotto il concetto di variabile, tentando di definire alcuni concetti basilari a riguardo.  Alcune situazioni fanno però intuire come il solo concetto…

Un approccio a Java: Le variabili - caso d'uso

Ciao a tutti amici e bentornati! Dopo l'introduzione fatta sulle variabili, cerchiamo di analizzare alcune criticità che si possono presentare in situazioni alquanto comuni. Partiamo quindi analizzando degli esempi pratici.  Esempio 1: divisione…

Un approccio a Java: Le variabili

Ciao a tutti e bentornati! Quest'oggi inizieremo un percorso che ci porterà a studiare, ed eventualmente ripassare, quelle che sono le basi della programmazione. Inizieremo parlando di variaibli. Introduzione Chiunque voglia approcciarsi al…

Hashmap con concatenamento: liste di trabocco

In questa breve serie di articoli andremo a vedere com'è possibile realizzare in C la struttura dati Hashmap. Nell'implementazione andremo ad usare le liste doppiamente concatenate come strutture dati ausiliarie. Andiamo…

WhatsApp: In arrivo Videoconferenza per 8 e nuovi emoji

Viviamo in un momento in cui, a seguito del confinamento da parte della Covid-19, molte persone stanno utilizzando strumenti alternativi che permettono loro di stare con un numero sufficiente di…

Facebook: come rimuovere i dati nascosti e le informazioni personali

Facebook è un fantastico social network che ci permette di essere sempre aggiornati su tutte le notizie dei nostri amici o della nostra famiglia o anche sulle notizie più rilevanti…

Come sapere quali applicazioni hanno accesso alla propria posizione, al microfono e alla telecamera

Quando si installa un'applicazione sul proprio smartphone, si decide quali permessi dare, ma non sempre è tutto così chiaro ed evidente. Oggi, spiegheremo come sapere se quei permessi  eccedono la legalità…

Utilizziamo i nostri cookie e quelli di terzi per migliorare i nostri servizi, compilare informazioni statistiche e analizzare le vostre abitudini di navigazione. Questo ci permette di personalizzare i contenuti che offriamo e di mostrarvi le pubblicità relative alle vostre preferenze. Cliccando su "Accetta tutto" acconsentite alla memorizzazione dei cookie sul vostro dispositivo per migliorare la navigazione del sito web, analizzare il traffico e assistere le nostre attività di marketing. Potete anche selezionare "Solo cookies di sistema" per accettare solo i cookies necessari al funzionamento del sito web, oppure potete selezionare i cookies che desiderate attivare cliccando su "Impostazioni". Tradotto con www.DeepL.com/Translator (versione gratuita)" o "Rifiuta".

Accetta tutti Solo cookies del sistema Configurazione