Java/Operatori: differenze tra le versioni
mNessun oggetto della modifica |
|||
Riga 119: | Riga 119: | ||
| style="text-align:center;" |'''<nowiki>||</nowiki>''' |
| style="text-align:center;" |'''<nowiki>||</nowiki>''' |
||
| style="text-align:center;" | '''a()''' '''<nowiki>||</nowiki>''' '''b()''' |
| style="text-align:center;" | '''a()''' '''<nowiki>||</nowiki>''' '''b()''' |
||
| style="text-align:left;" | |
| style="text-align:left;" | vero se '''a()''' vero o '''b()''' vero o entrambi veri |
||
|} |
|} |
||
Versione delle 14:58, 3 set 2013
Espressioni
Un'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
Gli 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
Un valore letterale è uno dei seguenti:
- null
- true e false
- un valore letterale stringa
- un class literal
Operatori - 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 possono essere 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, long 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( 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
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 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
Operatore | Uso | Significato |
---|---|---|
operatore di casting | (double)a | effettua una conversione di tipo detta cast |
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).