Sei sulla pagina 1di 35

Operatori e strutture

di controllo
Marco  La  Cascia  
A.A.  2017-­‐18  
Outline
•  Operatori  
•  Espressioni  
•  Ges:one  del  flusso  di  esecuzione  
•  Selezione  
•  Iterazione  
Operatori
•  ConceB  generali  
•  espressioni  
•  operandi  
•  operatori  unari  e  binari  
•  precedenza  e  associa:vità  

•  Operatori  in  Java  


•  Eredita:  in  larga  parte  dal  C/C++  
Precedenza degli operatori
Valutazione di espressioni
complesse
•  Ordine  di  valutazione  
•  Precedenza  e  associa:vità  
•  Tipo  delle  soLoespressioni  
•  Tipo  del  valore  risultante  
•  Esempi  
•  …  
Operatori di base
•  Operatore  di  assegnazione  =  
•  Valore  di  ritorno?  
•  Operatori  aritme:ci  
Operatori composti

•  Esempio:  
i = i+2;!
i += 2;!
•  Valore  di  ritorno?  
Operatori di pre/post
incremento/decremento

i = i+1;!
i += 1;!
++i; i++;!

Nota:  se  usa:  in  espressioni  pre  e  post  hanno  comportamento  differente!
Operatori bitwise
Operatori relazionali

•  Ritornano  un  boolean  


Confronto fra oggetti
•  Vengono  confronta:  i  valori  dei  reference  
•  Uguale  se  puntano  allo  STESSO  OGGETTO  e  non  a  un  
oggeLo  avente  gli  STESSI  VALORI  delle  variabili  d’istanza  
•  Esiste  un  metodo  per  confrontare  i  VALORI  di  due  
oggeB  
•  Le  String  (a  volte)  fanno  eccezione  
Confronto fra String
•  Due  modi  di  creare  una  String:  
•  String s = “abcd”;!
•  String s = new String(“abcd”);!
•  Quelle  create  con  la  sintassi  semplificata  vengono  
memorizzate  in  un  “pool  di  String”  nella  JVM  
•  String  di  questo  :po  che  hanno  lo  stesso  contenuto  
allora  avranno  anche  lo  stesso  indirizzo  e  quindi  
risulteranno  uguali  all’operatore  ==  

•  Il  modo  correLo  di  confrontare  String  in  ogni  situazione  


è  il  metodo  equals:  
•  s1.equals(s2)  è  true  se  il  contenuto  di  s1  ed  s2  è  uguale  
Esempio
String a = "Java";!
String b = "Java";!
String c = new String("Java");!
System.out.println(a==b);!
System.out.println(b==c);!
System.out.println(a.equals(b));!
System.out.println(b.equals(c)); !
•  Output  
true  
false  
true  
true  
Operatori logici

•  Normalmente  si  usano  le  versioni  short  circuit  


Concatenazione di String
•  Operatore  +  
String nome = "James ";!
String cognome = "Gosling";!
String nomeCompleto = "Mr. " + nome + cognome;!
•  Se  concateniamo  col  +  un  qualsiasi  :po  di  dato,  ad  
esempio  numerico,  con  una  stringa,  il  :po  di  dato  
sarà  automa:camente  conver:to  in  stringa.  
int b = 5;!
String s = “il doppio di b è “ + b*2;!
Operatore ternario
•  (espr-­‐booleana)  ?  espr1  :  espr2;  
•  il  :po  di  ritorno  sarà  quello  di  espr1  o  espr2  (non  
necessariamente  uguali  ma…)  
•  Non  sos:tuisce  if  ma  a  volte  semplifica  il  codice  
•  Esempi  
int massimo = a > b ? a : b;!

String query = "select * from table " +



!(condition != null ? "where " + condition : "");!
Gestione del flusso di
esecuzione
•  Condizioni  (stru9ure  di  selezione):  durante  la  fase  di  
run:me  permeLono  una  scelta  tra  l’esecuzione  di  
istruzioni  diverse,  a  seconda  che  sia  verificata  una  
specificata  condizione.  
•  Cicli  (stru9ure  di  iterazione):  in  fase  di  run:me  
permeLono  di  decidere  il  numero  di  esecuzioni  di  
determinate  istruzioni.  
•  Sequenza:  comportamento  standard,  l’istruzione  
successiva  viene  eseguita.  

•  TuB  i  costruB  possono  essere  annida:  quanto  si  vuole  


Costrutti semplici
•  CostruB  if  e  if  else  
•  CostruLo  while  

•  Con  if  e  while  è  possibile  implementare  qualsiasi  


struLura  di  controllo  

•  Esempio:  stampare  i  numeri  da  1  a  10  con  while  


Costrutti if e if else
•  if  (espr-­‐booleana)  istruzione;  
•  Esempio  
if (numeroLati == 3)!
!System.out.println("Questo è un triangolo");!

•  if  (espr-­‐booleana)  istruzione-­‐1;  
else  istruzione-­‐2;  
•  Esempio  
if (numeroLati == 3)!
!System.out.println("Questo è un triangolo");!
else!
!System.out.println("Questo non è un triangolo");!
Costrutto if else if a cascata
if(espr-booleana-1)!
istruzione-1!
else if(espr-booleana-2)!
istruzione-2!
…!
else if(espr-booleana-n)!
istruzione-n!
else!
istruzione-default!

•  istruzione  può  essere  un  qualsiasi  blocco  di  istruzioni  racchiuso  fra  
parentesi  graffe  
•  Buona  prassi  meLere  parantesi  graffe  anche  se  è  istruzione  singola  
Costrutto while
•  while(espr-­‐booleana)  istruzione;  
•  In  generale  presente  anche  inzializzazione  e  
aggiornamento  
[inizializzazione;]  
while  (espr-­‐booleana)  {  
istruzione;  
[aggiornamento  iterazione;]  
}  
•  Esempio  
int i = 1;!
while (i <= 10) {!
!System.out.println(i);!
!++i;!
}!
Costrutti avanzati
•  CostruLo  for  
•  CostruLo  do  while  
•  CostruLo  for  migliorato  
•  CostruLo  switch  
•  Istruzioni  break  e  conDnue  
Costrutto for
•  for  (inizializzazione;  espr-­‐booleana;  aggiornamento)  
     istruzione;  
•  Esempio  
public class ForDemo {!
!public static void main(String args[]) {!
! !for (int n = 10; n > 0; n--) {!
! ! !System.out.println(n);!
! !}!
!}!
}!
•  La  variabile  n  ha  “scope  di  ciclo  for”  
•  inizializzazione,  espressione  e  aggiornamento  sono  tuLe  e  
tre  opzionali  
•  Ciclo  infinito:  for(  ;  ;  )  istruzione  
Costrutto for
•  inizializzazione  può  riferirsi  a  più  variabili  (purchè  
dello  stesso  :po)  usando  la  virgola  come  separatore  
•  aggiornamento  può  essere  una  qualsiasi  sequenza  
di  istruzioni  (o  chiamate  a  metodi)  separate  dalla  
virgola  
•  Esempio  
for (int i = 0, j = 10; i < 5 || j > 5; i++, j--,
System.out.println("aggiornamento")) {!
!...!
}!
Costrutto do while
•  do  {  
istruzione;  
while(espr-­‐booleana);  
•  In  generale  presente  anche  inzializzazione  e  
aggiornamento  
[inizializzazione;]  
do  {  
istruzione;  
[aggiornamento  iterazione;]  
}  while  (espr-­‐booleana);  
•  istruzione  è  sempre  eseguita  almeno  una  volta  
Esempio
public class DoWhile {!
public static void main(String args[]) {!
int i = 10;!
do {!
System.out.println(i);!
} while(i < 10);!
}!
}!

•  L’output  è:  10  


•  istruzione  è  stata  eseguita  una  volta    
Costrutto for migliorato
•  Ciclo  for  che  permeLe  automa:camente  di  ciclare  
aLraverso  una  collezione  di  da:  
•  for(variabile_temporanea  :  ogge9o_iterabile)  
     istruzione;  
•  Esempio  
int [] arr = {1,2,3,4,5,6,7,8,9};!
for (int tmp : arr) {!
System.out.println(tmp);!
}!

•  Nota:  variabile_temporanea  è  una  copia  dell’elemento  


dell’array  che  quindi  non  potrà  essere  modificato  con  
questo  costru9o  
Costrutto switch
switch (variabile di test) {!
case valore_1:!
istruzione;!
break;!
case valore_2:!
istruzione;!
break;!
case valore_3:!
case valore_4: !
istruzione;!
break;!
..........!
default: !
istruzione_default;!
}!
Costrutto switch
•  La  variabile  di  test  deve  essere  o  di  :po  stringa,  o  di  
un  :po  di  dato  compa:bile  con  un  intero,  ovvero  
un  byte,  uno  short,  un  char,  oppure  direLamente  
un  int  (ma  non  un  long).  
•  valore_1...valore_n  devono  essere  espressioni  
costan:  e  diverse  tra  loro  
•  Se  non  c’è  il  break  vengono  eseguite  tuLe  le  
istruzioni  successive  
•  Buona  prassi  meLere  sempre  il  default  
Costrutto switch
public String getTipoGiornoSettimana(String giornoDellaSettimana) {!
String typeOfDay;!
switch (giornoDellaSettimana) {!
case "Monday":!
typeOfDay = "Inizio settimana";!
break;!
case "Tuesday":!
case "Wednesday":!
case "Thursday":!
case "Friday":!
typeOfDay = "Settimana piena";!
break;!
case "Saturday":!
case "Sunday":!
typeOfDay = "Weekend";!
default:!
typeOfDay = "Indefinito!";!
break;!
}!
return typeOfDay;!
}!
Istruzioni break e continue
•  break  
•  termina  l’intero  ciclo  

•  Esempio:  stampa  i  primi  10  interi  


int i = 1;!
while (true) //ciclo infinito!
{!
if (i > 10) break;!
System.out.println(i);!
i++;!
}!
Istruzioni break e continue
•  con:nue  
•  termina  l’iterazione  corrente  

•  Esempio:  stampa  i  primi  10  interi  escluso  5  


int i = 0;!
do{!
i++;!
if (i == 5) continue;!
System.out.println(i);!
} while(i <= 10);!
label
•  break  e  conDnue  possono  u:lizzare  label  per  specificare,  nel  
caso  di  cicli  annida:,  su  quale  ciclo  devono  essere  applica:  
•  La  label  è  posizionata  prima  di  un  blocco  che  di  solito  è  un  
ciclo  o  con:ene  un  ciclo  
•  Esempio  
int j = 1;!
pippo: //possiamo dare un qualsiasi nome ad una label!
while (true){!
while (true){!
if (j > 10) break pippo;!
System.out.println(j);!
j++;!
}!
}!

•  Nota:  senza  la  label  il  break  avrebbe  interroLo  il  ciclo  più  interno  
Riepilogo
•  Operatori  
•  Espressioni  
•  Ges:one  del  flusso  di  esecuzione  
•  Selezione  
•  Iterazione  
Riferimenti
•  Claudio  De  Sio  Cesari.  “MANUALE  DI  JAVA  8”.  Casa  
editrice  Hoepli,  2014