Java/Operatori
Espressioni
modificaUn'espressione è una scrittura nel codice sorgente del programma che, a tempo di esecuzione, identificherà un valore di un certo tipo. Una variabile contiene un valore, mentre una espressione restituisce un certo valore come risultato di un calcolo.
Le espressioni sono costituite da elementi componibili, che possono essere combinati un numero di volte arbitrario, a patto di rispettarne la sintassi. Alcuni rappresentano a loro volta delle espressioni, altri ne combinano due o più secondo delle regole ben precise.
Ad esempio, i valori letterali 3
e 5
rappresentano, a tempo di esecuzione, i rispettivi numeri interi, e possono essere usati come espressioni numeriche; ma possono anche essere combinati, tramite l'operatore di somma, per formare una nuova espressione, come 3 + 5
.
Quindi, una espressione può essere vista come una struttura ad albero, in cui ogni elemento è un nodo terminale o una combinazione di altri elementi.
Elementi sintattici
modificaGli elementi che compongono una espressione sono
- valori letterali
- operatori: confrontano due o tre espressioni e restituiscpno un risultato in base a queste
- invocazioni di metodi
- letture e scritture di variabili locali, campi o celle di array
- coppie di parentesi tonde che racchiudono una espressione (a volte utili per garantire o evidenziare la precedenza tra gli operatori)
- ...
Valori letterali
modificaUn valore letterale è uno dei seguenti:
null
true
efalse
- un valore letterale stringa
- un class literal
Operatori - Definizione
modificaClassifichiamo 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
modificaGli operatori binari possono essere divisi in:
Algebrici
modificaSono 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, long e byte) |
si usano per eseguire operazioni di somma, sottrazione, divisione e moltiplicazione:
lunghezzaDellaCirconferenza = 2 * PI_GRECO * raggioDellaCirconferenza;
Relazionali
modificaSono 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
modificaSono 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
modificaAgiscono 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( staiLavorando() && dormi() ) fannullone = true;
Operatore | Uso | Significato |
---|---|---|
&& | a() && b() | vero se a() vero e b() vero |
|| | a() || b() | vero se a() vero o b() vero o entrambi veri |
Questi implementano la cosiddetta "valutazione a corto circuito", in quanto è garantito che vengono esaminate solo le proposizioni necessarie a stabilire il valore di veritá: se in
if( controllaQuesto() && controllaQuello() )
la prima invocazione a metodo restituisce false
, allora la seconda non sarà affatto eseguita, e l'intera condizione restituirà false
.
Orientati ai bit
modificaAgiscono 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
modificaJava 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 #=
modificaIstruzioni 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
modificaAgiscono su una sola variabile, alcuni richiedono che il risultato sia assegnato a una seconda, altri no.
Algebrici
modificaHa 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
modificaIl 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 di b bit |
<< | 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
Casting
modificaOperatore | Uso | Significato |
---|---|---|
operatore di casting | (double)a | effettua una conversione di tipo detta cast |
Operatori Ternari
modificaÈ 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 (ed è molto più comoda).