Java/Operatori: differenze tra le versioni

Wikibooks, manuali e libri di testo liberi.
Contenuto cancellato Contenuto aggiunto
Riga 104: Riga 104:


====Orientati ai bit====
====Orientati ai bit====
Agiscono su i singoli [[w:bit|bit]] di cui sono composti gli operandi, eseguono cioé l'operazione su ogni coppia di bit (i primi, i secondi...) separatamente. Vanno applicati '''solo alle variabili numeriche'''.
Agiscono su i singoli [[w:bit|bit]] di cui sono composti gli operandi, eseguono cioè l'operazione su ogni coppia di bit (i primi, i secondi...) separatamente. Vanno applicati '''solo alle variabili numeriche'''.


===Funzionali===
===Funzionali===

Versione delle 12:42, 23 mar 2008

Indice del libro

Introduzione

Gli operatori servono a manipolare e confrontare le variabili e sono dunque alla base di ogni programma; Java ne mette a disposizione molti, con una sintassi simile a quella del C.

Definizione

Classifichiamo gli operatori in tre categorie a seconda del numero di operandi: unari (uno), binari (due) e ternari (tre). Cominciamo da quelli binari, i più comuni.

Operatori binari

Gli operatori binari agiscono su due variabili semplici (non su oggetti) di tipo compatibile (due double, un double e un int, ma MAI un boolean e un integero un byte e un oggetto), per produrre un risultato. Sono a loro volta divisi in:

Algebrici

Sono i quattro operatori algebrici fondamentali, a cui si aggiunge quello di resto della divisione e hanno lo stesso significato che assumono in aritmetica.

Operatore Uso Significato
+ 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, longint e byte)

si usano per eseguire operazioni di somma, sottrazione, divisione e moltiplicazione:

 lunghezzaDellaCirconferenza = 2 * PI_GRECO * raggioDellaCirconferenza;

Relazionali

Sono detti 'relazionali' perché non hanno per risultato un numero, ma confrontano i due operandi e restituiscono un valore di verità:

Operatore Uso Significato
== a == b vero se a è uguale a b
!= a != b vero se a è diverso da b
> a > b vero se a è maggiore di b
< a < b vero se a è minore di b
>= a >= b vero se a è maggiore o uguale a b
<= a <= b vero se a è minore o uguale a b

vengono usati ovunque sia richiesto un test di verità:

 if( a >= b ) faiQualcosa();

Fai attenzione alla differenza tra == e .equals(), che verrà affrontata quando parlemo di oggetti (nel caso di tipi semplici non si puó utilizzare la seconda forma).

Booleani

Sono detti cosí in onore di chi li ha introdotti: G. Boole. Per chiarezza -gli errori di programmazione sono sempre in agguato- sono suddivisi in logici e orientati ai bit.

Logici

Agiscono su intere proposizioni e possono essere usati solo nei test (if, for, do, while), per congiungere più condizioni:

 if( seiUscito(tu) || staiDormendo(tu) ) nonRispondiAlTelefono();
 while( mangi() && dormi() ) staiLavorando = False;
Operatore Uso Significato
&& a() && b() vero se a() vero e b() vero
|| a() || b() True se a() vero o b() vero o entrambi veri

È garantito che vengono esaminate solo le proposizioni necessarie a stabilire il valore di veritá: se in

 if( controllaQuesto() && controllaQuello() )

Orientati ai bit

Agiscono su i singoli bit di cui sono composti gli operandi, eseguono cioè l'operazione su ogni coppia di bit (i primi, i secondi...) separatamente. Vanno applicati solo alle variabili numeriche.

Funzionali

Java ha aggiunto un operatore funzionale binario:

Operatore Uso Significato
instanceof a instanceof B vero se a è un'istanza della classe B

Per ora ignoratelo. Tornerà utile quando tratteremo classi e eredità.

Operatori #=

Istruzioni come:

 a = a + 1;
 b = 3 * b;
 c = c % d;
 e = e + f;

sono molto frequenti nella scrittura di programmi, cosí è stata inventata una forma abbreviata, il cui significato è identico a quelle precedenti,

 a+=1;
 b*=3;
 c%=d;
 

il loro uso rende il codice piú intuitivo (io penso "Aggiungi a a b", non "Aggiungi a a b e metti il risultato in a") ma è un fatto personale, per il compilatore

 a = a + d; e a+=d;

sono equivalenti.

È sconsigliato -ma legittimo- l'uso di:

 &= |=

È invece un errore scrivere:

 controllaQuesto() &&= controllaQuello(); 

La facilità con cui si incontra l'operazione

 a+=1;

è tanto elevata che ne è stata concepita una forma ancora più breve:

 ++a o a++

Sono equivalenti in genere, ma la prima incrementa la variabile prima di utilizzarla, la seconda dopo. Ciò è di vitale importanza in istruzioni (a cui i programmatori C sono abituati, ma che è buona norma non usare in Java) come:

 elementoNumeroA = elementi[a++];
  (l'elemento preso sarà il numero a o a+1 ?)

ma indifferente in:

 for(int i = 0; i=100; i++); for(int i = 0; i=100; ++i);

Le stesse considerazioni valgono per a-- e --a.

Operatori unari

Agiscono su una sola variabile, alcuni richiedono che il risultato sia assegnato a una seconda, altri no.

Algebrici

Ha significato uguale al corrispettivo algebrico:

Operatore Uso Significato
- -a inverte il segno di a

il risultato deve essere assegnato a una variabile;

b = -a;

Booleani

Il significato è lo stesso che hanno in algebra booleana.

Operatore Uso Significato
! !a inverte il valore di verità di a
~ ~a complemento a uno di a

non è obbligatorio assegnarne il valore a un'altra variabile, ma potrebbe rendere incomprensibile il tuo programma.

Alcuni sono unari, malgrado abbiano due operandi:

Operatore Uso Significato
>> a>>b sposta bit a bit a verso destra
<< a<<b sposta bit a bit a verso sinistra di b bit

Il significato di "spostare bit a bit" è molto più semplice di quanto si pensi:

 se a era
   10000000
 allora a>>5 è
   00000100


Funzionali

Il loro significato è spesso oscuro, perché non hanno corrispondenti in aritmetica.

Operatore Uso Significato
(nome_di_tipo) (double)a effettua una conversione di tipo
sizeof sizeof a oppure sizeof(int) restituisce la dimensione in byte del dato (o del tipo)

sizeof ha due forme possibili:

 dimensioneDellaMiaVariabile = sizeof laMiaVariabile;
 dimensioneDelTipoInteger = sizeof(int);

la seconda è un' eredità del C: in Java è inutile, perché le dimensioni dei tipi sono fisse, a meno che vi interessi veramente sapere quanta memoria occupa un int o un float.

Operatori Ternari

È facile avere a che fare con variabili che devono assumere due valori differenti data una condizione. Per esempio:

 //calcoliamo |a| (il modulo di a)
 if(a >= 0)
 {  modulo = a;
 }
 else
 {  modulo = -a;
 }

L'operatore ?: sostituisce questa scrittura, pesante e pedante:

 modulo = a>0? a: -a;

che equivale alla precedente (e è molto più comoda).