Corso di Java

Operatori relazionali e logici II

 

L’utilizzo degli operatori && e || può dare luogo al cosiddetto fenomeno di “circuito corto” (short circuiting), che consiste nel fatto che la valutazione dell’espressione continuerà solo finché il suo valore booleano non potrà essere valutata in maniera non ambigua, cosicché potranno non essere valutate tutte le parti dell’espressione logica.
L’esempio seguente ci potrà rendere le cose più chiare:

class CircuitoCorto {
    public boolean minoreDi(int sxval, int dxval) {
        System.out.println("Domanda:  " + sxval + " e' minore di "
                          + dxval+ "?");
        System.out.println("Risposta: " + (sxval < dxval));
        return sxval < dxval;
    }
     
    public static void main(String arg[]) {
        CircuitoCorto cc = new CircuitoCorto();
        boolean risultato = cc.minoreDi(0,1) && cc.minoreDi(2,2)
                         && cc.minoreDi(2,3);
           
        System.out.println("Il valore dell'espressione e': " + risultato);
    }
}

Questa classe fornisce un metodo pubblico che riceve in ingresso due valori e restituisce un valore booleano che vale true se il primo parametro è minore del secondo, false altrimenti; inoltre strampa a video delle informazioni sull’espressione che sta valutando.
Nel metodo main() abbiamo istanziato un oggetto della classe “CircuitoCorto” e dichiarato una variabile locale booleana in cui memorizziamo il valore dell’espressione:

cc.minoreDi(0,1) && cc.minoreDi(2,2) && cc.minoreDi(2,3)

che equivale alla seguente espressione espressa in linguaggio matematico:

0 < 1 AND 2 < 2 AND 2 < 3

poiché la seconda relazione è falsa, l’intera espressione è falsa.
Poiché basta, in una serie di AND consecutivi, che una sola relazione sia falsa perché sia falsa l’intera espressione, il test viene fermato non appena viene trovata una relazione non vera.

Così l’output del programma di esempio sarà:

Domanda:  0 e' minore di 1?
Risposta: true
Domanda:  2 e' minore di 2?
Risposta: false
Il valore dell'espressione e': false


cioè non viene valutata la terza relazione, perché ormai il valore dell’intera espressione sarà comunque falso.
Se provate a sostituire nell’espressione l’operatore & al posto dell’operatore && otterrete il output dal programma il seguente risultato:

Domanda:  0 e' minore di 1?
Risposta: true
Domanda:  2 e' minore di 2?
Risposta: false
Domanda:  2 e' minore di 3?
Risposta: true
Il valore dell'espressione e': false


che mostra che sono state valutate tutte e tre le relazioni.

E’ intuitivo comprendere che la prima scelta è più efficiene della seconda, perché valuta l’espressione in minor tempo, dovendo eseguire meno istruzioni.
Analogamente l’operatore || è più efficiente dell’operatore |.

Come avviene per gli operatori aritmetici, anche gli operatori logici hanno delle istruzioni di assegnamento abbreviate, che sono riassunti nella tabella seguente e il cui significato dovrebbe essere abbastanza chiaro:

ESPRESSIONE

SIGNIFICATO

x &= y

x = x & y

x |= y

x = x | y

x ^= y

x = x ^ y


Notiamo che non sono previsti assegnamenti abbreviati per gli operatori && e ||.

Un altro operatore logico, molto usato, è l’operatore ternario, che ha la seguente forma:

test ? risultatovero : risultatofalso


Questo operatore esegue l’espressione logica (test) posta prima del ‘?’; se il risultato dell’espressione è true ritorna il valore risultatovero, altrimenti ritorna il valore risultatofalso.

Ad es. proviamo ad eseguire il seguente programma:

import java.util.Random;

class TestTernario {
    public static void main(String arg[]) {
        Random rnd = new Random();
        int i = rnd.nextInt();
        int j = rnd.nextInt();
     
        System.out.println("i vale " + i);
        System.out.println("j vale " + j);
        System.out.println("Il maggiore tra i due e' " + (i > j ? i : j));
    }
}


Vengono generati due numeri interi pseudocasuali e l’espressione ternaria restituisce il valore maggiore; un possibile risultato è il seguente:

i vale 2042297107
j vale 405272159
Il maggiore tra i due e' 2042297107


Nella prossima lezione esamineremo gli operatori che ci consentono di operare a livello dei bit.

 

Torna all'indice Generale del corso di Corso di Java di Software Planet