Java/Operatori: differenze tra le versioni
m Bot: Varie sostituzioni standard |
|||
Riga 104: | Riga 104: | ||
====Orientati ai bit==== |
====Orientati ai bit==== |
||
Agiscono su i singoli [[w:bit|bit]] di cui sono composti gli operandi, eseguono |
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
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).