Caratteri

  • In C  e C++, il tipo di dati char usa 8 bit, e usa il codice ASCII (American Standard Code for Information Interchange) per la codifica dei caratteri.
  • ASCII usa solo 7 bit (128 caratteri in tutto). I rimanenti 128 valori rappresentabili con 8 bit sono usati per rappresentare altri caratteri (come lettere con accenti), ma con codifiche diverse in sistemi/linguaggi diversi!! 

  • [Avete mai provato a leggere sotto Linux un file di solo testo in italiano scritto sotto Windows?] 
  • In Java, il tipo di dati char usa 16 bit, e usa il codice UNICODE, che permette di rappresentare 65535 caratteri
  • char usa lo stesso numero di bit di short, però non usa il segno (unsigned)
  • Le costanti di tipo carattere si scrivono come 's' oppure \u0000 (zero in UNICODE)



Tipo di dati  boolean

  • In molti linguaggi (come C e C++) non esiste un tipo di dati booleano (dal matematico George Boole): si usano interi con opportune convenzioni
  • In Java esiste il tipo primitivo boolean
Sono di tipo boolean:
  • le costanti true e false (gli unici valori)
  • il risultato di espressioni con operatori booleani
  • il risultato di qualunque confronto tra valori



Operatori Booleani (1)

Operatori Booleani in Java
(in ordine decrescente di precedenza)
! NOT
&, && AND
^ XOR
|, || OR
Tabella di verità
x
!x
x & y
x && y
x ^ y
x | y
x || y
false
false
true
false
false
false
true
false
false
false
true
true
false
true
true
false
true
true
true
true
false
true
false
true




Operatori Booleani (2)

Differenze tra & e && (AND), e tra | e || (OR)
    && e || sono operatori lazy (pigri) o short-cut: valutano il secondo argomento solo se è necessario.
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 b/a viene valutato sempre, anche se a==0
causando in questo caso un errore
(a!=0) && (b/a) >100 se a==0 , b/a non viene valutato e la condizione vale false




Operatori di confronto

>
>=
<
<=
==
!=
  • Come eredità del C, si usa '==' per l'uguaglianza, e non '=' (assegnamento)
  • Applicati alle espressoni numeriche (int, double, ...) hanno il significato ovvio
  • Gli operatori == e != possono essere applicati a qualunque tipo di dato
int x = 10;
int y = 20;
boolean b = x < y; 
b vale true
boolean b1 = x >= y == b; b1 vale false
double r = Math.sqrt(2);
boolean b2 = 2.0 == r * r;

b2 vale false!!

Attenzione: in generale non ha senso confrontare due valori double con == o !=a causa degli errori di approssimazione

  • Gli operatori di confronto hanno precedenza su quelli logici:
int a, x;
boolean b = false;
a = 0;
x = 1;
boolean c = a != 0 & x > 0 == b 
Alla fine c vale false, quindi l'espressione viene letta come
(a != 0) & ((x > 0) == b)
Nota che ((a != 0) & (x > 0)) == b) vale true



Uso di espressioni booleane: Istruzioni if-else

In molti programmi o algoritmi, l'esecuzione di uno o più passi può dipendere da certe condizioni (valori in input, stato della memoria,...). Per controllare l'esecuzione di questi passi si può usare l'istruzione condizionale if-else: vediamone alcuni esempi (la studieremo in dettaglio più avanti).
 
 
if (x == 0) System.out.println("x vale zero");
        //  la stringa viene stampata solo se x e' uguale a zero
        //  cioe' se la condizione e' vera
         //


 
if (x > y) System.out.println("x e' maggiore di y");  
   else    System.out.println("y e' maggiore di o uguale a x");
      
//  il ramo 'else' viene eseguito solo se la condizione e'

       //  falsa
 

if (x > y) System.out.println("x e' maggiore di y");  
   else  if (x < y) System.out.println("y e' maggiore di x");  
            else    System.out.println("y e y sono uguali"); 
 
 




Confronto tra oggetti

Si possono confrontare gli oggetti di una classe con "==" oppure con il metodo equals.
  • (obj1 == obj2) vale true solo se obj1 e obj2 sono (puntatori al) lo stesso oggetto
  • obj1.equals(obj2) normalmente vale true se i due oggetti hanno ``la stessa struttura''
Rectangle cerealBox = new Rectangle(5,10,20,30);
Rectangle crispyCrunchyStuff = cerealBox;
Rectangle oatmealBox = new Rectangle(5,10,20,30);
boolean b = cerealbox == crispyCrunchyStuff; b = true
boolean b1 = cerealbox == oatmealBox; b1 = false
boolean b2 = cerealbox.equals(oatmealBox); b2 = true