Lutilizzo degli operatori && e || può dare luogo
al cosiddetto fenomeno di circuito corto (short circuiting),
che consiste nel fatto che la valutazione dellespressione
continuerà solo finché il suo valore booleano non potrà essere valutata
in maniera non ambigua, cosicché potranno non essere valutate tutte
le parti dellespressione logica.
Lesempio 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 sullespressione
che sta valutando.
Nel metodo main() abbiamo istanziato un oggetto della classe
CircuitoCorto e dichiarato una variabile locale booleana
in cui memorizziamo il valore dellespressione:
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, lintera espressione è
falsa.
Poiché basta, in una serie di AND consecutivi, che una sola relazione
sia falsa perché sia falsa lintera espressione, il test viene
fermato non appena viene trovata una relazione non vera.
Così loutput 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
dellintera espressione sarà comunque falso.
Se provate a sostituire nellespressione loperatore &
al posto delloperatore && 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 lespressione in minor tempo,
dovendo eseguire meno istruzioni.
Analogamente loperatore || è più efficiente delloperatore
|.
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, è loperatore ternario,
che ha la seguente forma:
test ? risultatovero : risultatofalso
Questo operatore esegue lespressione logica (test)
posta prima del ?; se il risultato dellespressione
è 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 lespressione
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