Operatori e Gestione del flusso di esecuzione
Obiettivi 1. Conoscere e saper utilizzare i vari operatori 2. Conoscere e saper utilizzare i costrutti di programmazione semplici 3. Conoscere e saper utilizzare i costrutti di programmazione avanzati
Operatori di base ( Ob. 1 ) Operatore di assegnazione: = Operatori aritmetici: + - * / % % è l’operatore modulo: 5 % 3 = 2; 10 % 2 = 0; 100 % 50 = 0
Operatori con assegnazione inclusa: += “i += 2” è equivalente a “i=i+2” -= “i -= 2” è equivalente a “i=i-2” *= “i *= 2” è equivalente a “i=i*-2” /= “i /= 2” è equivalente a “i=i/2” %= “i %= 2” è equivalente a “i=i%2”
Operatori (unari) di pre e post-incremento (e decremento) : ++ Sono espressioni equivalenti: i = i + 1 i += 1 i++ Post-incremento (= ha la priorità) ( x=5; y=x++; risulta y=5 e x=6) ++i Pre-incremento (prioritario rispetto a =) ( x=5; y=++x; risulta y=x=6) --
Operatori bitwise: eseguono operazioni direttamente sui bit ~ NOT (operatore unario) & AND (operatore binario) | OR ( “ “ ) ^ XOR ( “ “ ) << Shift a sinistra >> Shift a destra >>> Shift a destra senza segno &= AND e assegnazione |= OR e assegnazione ^= XOR e assegnazione <<= Shift a sinistra e assegnazione >>= Shift a destra e assegnazione
Esempi Operatori bitwise: sapendo che la rappresentazione binaria di 1 è 00000001, avremo che ~1 varrà 11111110 ovvero -2. byte a = 35; //rappresentazione binaria 00100011 a = a >> 2; avremo che: a = 8 // rappresentazione binaria 00001000 (Il numero dei bit da scorrere è rappresentato dall’operando a destra dell’operazione, in questo caso è 2) byte b = -8; //rappresentazione binaria 11111000 b = b >> 1; avremo che: b = -4 //rappresentazione binaria 11111100
Operatori relazionali o di confronto : == Uguale a Tutti i tipi != Diverso da Tutti i tipi > Maggiore Solo i tipi numerici < Minore Solo i tipi numerici >= Maggiore o uguale Solo i tipi numerici <= Minore o uguale Solo i tipi numerici
Attenzione alle Stringhe: String a = "Java"; String b = "Java"; String c = new String("Java"); System.out.println(a==b); System.out.println(b==c); produrrà il seguente output: true false Infatti a e b punteranno esattamente allo stesso oggetto. Mentre nel caso di c, avendo utilizzato la parola chiave new, verrà creato un oggetto ex novo, anche se con lo stesso contenuto dei precedenti.
Ricordiamo che il giusto modo per confrontare due stringhe rimane l’utilizzo del metodo equals(). Infatti il seguente frammento di codice: System.out.println(a.equals(b)); System.out.println(b.equals(c)); produrrà il seguente output: true True
A tal proposito è bene ricordare che la classe String definisce un metodo chiamato intern(), che prova a recuperare proprio l’oggetto String dal pool di stringhe, utilizzando il confronto che fornisce il metodo equals(). Nel caso nel pool non esista la stringa desiderata, questa viene aggiunta, e viene restituito un reference ad essa. In pratica, date due stringhe t ed s: s.intern() == t.intern() è true se se solo se s.equals(t) vale true.
Operatori logico – booleani : ! NOT logico & AND logico | OR logico ^ XOR logico && Short circuit AND (False se la 1° è false) || Short circuit OR ( True se la 1° è true) &= AND e assegnazione |= OR e assegnazione ^= XOR e assegnazione
Concatenazione di stringhe con + + oltre che essere un operatore aritmetico, è anche un operatore per concatenare stringhe. Per esempio il seguente frammento di codice: String nome = "James "; String cognome = "Gosling"; String nomeCompleto = "Mr. " + nome + cognome;
Priorità degli operatori Separatori . [] () ; , da sx a dx ++ -- + - ~ ! (tipi di dati) * / % + - << >> >>> < > <= >= instanceof == !=
Da sx a dx & ^ | && || Da dx a sx ?: = *= /= %= += -= <<= >>= >>>= &= ^= |=