Ricordiamo o scopriamo la precedenza degli operatori

Ricordiamo o scopriamo la precedenza degli operatori
A ciascun operatore è associato un grado di priorità. I calcoli con priorità maggiore sono eseguiti prima degli altri.
Nell’incertezza, si possono sempre utilizzare le parentesi tonde
così come faremmo nell’aritmetica tradizionale.
Operatori aritmetici o algebrici
Operatore
Uso
+
a+b
somma a e b
-
a-b
sottrae b da a
*
a*b
moltiplica a per b
/
a/b
divide a per b
%
a%b
calcola il resto della divisione intera di a per b (solo con int,
long e byte)
++
a++ , ++a
incrementa la variabile
--
a--, --a
decrementa la variabile
Ordine di precedenza
Significato
Priorità maggiore
var++
minore
Ricordiamo: a + b + c/num
(a + b + c ) / num
minore
var--
++var
*
/
%
+
-
--var
calcola prima c/num ed in seguito somma i tre addendi
divide la somma per num
Operatori di assegnamento in ordine decrescente di precedenza
operatore
=
+=
-=
*=
/=
%=
esempio
x = valore
equivale a
x  valore
x += y
x -= y
x *= y
x /= y
x %= y
x=x+y
x=x-y
x=x*y
x=x/y
x=x%y
Nelle tabelle complete se ne vedono altri con ordine di precedenza inferiore
assegnamento = += -= *= /= %= &= |=
Operatori booleani o logici
Sono detti così in onore di chi li ha introdotti: G. Boole. Sono suddivisi in logici e orientati ai bit. Si considerano,
nel corso, solo i primi che agiscono su intere proposizioni
Operatori booleani (o logici) in Java
(in ordine decrescente di precedenza)
!
&&
^
||
NOT
AND
XOR
OR
Gli operatori && e || possono essere usati per congiungere più condizioni ed implementano la cosiddetta
"valutazione a corto circuito", in quanto è garantito che vengano esaminate solo le proposizioni necessarie
a stabilire il valore di verità. Sono detti operatori lazy (pigri) o short-cut: valutano il secondo argomento
solo se è necessario.
Operatore
Uso
Significato
&&
a() && b() vero se a() vero e b() vero
||
a() || b() vero se a() vero o b() vero o entrambi veri
c && d
d viene valutato solo se c vale true
c || d
d viene valutato solo se c vale false
a!=0 && b/a > 100
si legge (a!=0) && ((b/a) > 100)
se a==0, allora ((b/a) > 100) non viene valutato e la condizione vale false
Qual è il valore di (true ^ true && false || !true) ?
Suggerimento: data la precedenza degli operatori la formula viene letta come
( (true ^ (true && false) ) ||
(!true) )
NOT precedenza maggiore
AND
XOR … (or esclusivo) si può ricordare più facilmente come l'operatore di confronto diverso da
Or precedenza minore
http://www.di.unipi.it/~andrea/Didattica/LIP-07/Tipi-Input/TipoBoolean/main.html
Segmento di programma:
System.out.println("\n" + (true ^ true && false || !true) );
System.out.println("\n" + (true&& false || !true) );
System.out.println("\n" + (true ^ true && false) );
L'operatore xor (or esclusivo)
si ricorda più facilmente
come l'operatore di confronto diverso da
Operatori relazionali o di confronto
Sono detti 'relazionali' perché non hanno per risultato un numero, ma confrontano i due operandi e
restituiscono un valore di verità. Il risultato di queste operazioni è sempre un valore boolean, ovvero true o
false.
Gli operatori relazionali e di confronto in Java, in ordine decrescente di precedenza sono i seguenti:
<
>
Operatore Uso
<=
Significato
>=
==
Tipo
operandi
tutti i tipi
==
a == b vero se a è uguale a b
!=
a != b vero se a è diverso da b
tutti i tipi
>
a > b vero se a è maggiore di b
numerici
<
a < b vero se a è minore di b
numerici
>=
a >= b vero se a è maggiore o uguale a b
numerici
<=
a <= b vero se a è minore o uguale a b
numerici
Errori sintattici:
if ( 0 < numero < 1000)
… occorre scrivere:
!=
if ( 0 < numero) && (numero < 1000)
if ( 0 < numero && numero < 1000)
oppure con più attenzione alle singole condizioni: if ( ( 0 < numero) && (numero < 1000) )
http://www.dis.uniroma1.it/~oop/drupal/sites/default/files/02%3A3_operatori-2015.pdf (già ppt 2003-04)
Segmenti di programma equivalenti
if ((media>6) && (media<=7)) {
……
}
if ( 6 < media && media <=7 ){
……
}
boolean altro = false; // oppure true potendo assegnare il minimo o il massimo della banda
……
// decidere
if ((media>6) && (media<=7)) {
if (altro)
credito = 5;
else
credito = 4;
}
nb: Un'espressione booleana esprime già, per sua natura, un valore di verità: non c'è bisogno di confrontarla
con true per stabilire se è vera e con false per stabilire se è falsa.
Tabella delle precedenze degli operatori di Java
La tabella mostra le precedenze assegnate agli operatori Java di maggior uso. Gli operatori sono elencati in
ordine di precedenza: più in alto un operatore appare nella tabella, più alta è la sua precedenza. In un
espressione vengono valutati prima gli operatori con precedenza relativa più alta. Gli operatori sulla stessa
riga hanno la stessa precedenza.
operatori postfissi [] . (params) expr++ expr-operatori unari
++expr --expr +expr -expr !
instanze e cast
new
aritmetici
*/%
aritmetici
+-
di relazione
< > <= >=
uguaglianza
== !=
AND
&&
OR
||
condizionale
?:
assegnamento
= += -= *= /= %= &= |=
(type)expr
Quando nella stessa espressione appaiono operatori con la stessa precedenza occorre stabilire quale viene
valutato prima. Gli operatori binari sono valutati da sinistra a destra, mentre gli assegnamenti sono valutati
da destra a sinistra.
http://homes.di.unimi.it/~alberti/Prog09/Lucidi/precedenze.html
- Regole di precedenza tra gli operatori di Java
Nella seguente tabella sono riportati, in ordine di priorità, tutti gli operatori di Java. Gli operatori
riportati nelle righe più alte hanno priorità maggiore rispetto quelli presentati più in basso. All'interno di
ciascuna riga, la priorità è maggiore verso sinistra e minore verso destra.
Priorità maggiore
minore
minore
Tabella 5.14: schematizza l'ordine di precedenza degli operatori di Java.
pg.21 http://www.sauronsoftware.it/corsojava/Lezione_05.pdf