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