Vai al contenuto

Java/Operatori

Wikibooks, manuali e libri di testo liberi.
Il titolo di questa voce non è corretto per via delle caratteristiche del software MediaWiki. Il titolo corretto è Java/Espressioni.

Java

Linguaggio Java
Linguaggio Java

categoria · sviluppo · modifica
Come posso contribuire?

→ Vai su Wikiversity

Java:  Guida alla programmazioneJava/Introduzione - Specifica di linguaggio - Libreria standardJava/Comunicazione seriale

Tipi di datoJava/Tipi di datoEspressioniJava/OperatoriVariabiliJava/Variabili localiIstruzioniJava/IstruzioniStrutture di controlloJava/Strutture di controlloPackageJava/Package
Classi e oggettiJava/Classi e oggettiOggettiJava/OggettiMetodiJava/MetodiMetodi (cont.)Java/Metodi/2ArrayJava/Array
Modificatori di accessoJava/Modificatori di accessoEreditarietàJava/Ereditarietà
Gestione delle eccezioniJava/Gestione delle eccezioniGenericsJava/Generics
Thread e parallelismoJava/MultithreadingInterblocco ricontrollatoJava/Interblocco ricontrollato
Alcune differenze con il CJava/Concetti fondamentaliLessicoJava/LessicoGrammaticaJava/Grammatica

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

[modifica | modifica sorgente]

Gli elementi che compongono una espressione sono

Valori letterali

[modifica | modifica sorgente]

Un valore letterale è uno dei seguenti:

  • null
  • true e false
  • un valore letterale stringa
  • un class literal


Operatori - Definizione

[modifica | modifica sorgente]

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

[modifica | modifica sorgente]

Gli operatori binari possono essere divisi in:

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;

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).

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.

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
[modifica | modifica sorgente]

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.

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 #=

[modifica | modifica sorgente]

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

[modifica | modifica sorgente]

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

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;

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
Operatore Uso Significato
operatore di casting (double)a effettua una conversione di tipo detta cast

Operatori Ternari

[modifica | modifica sorgente]

È 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).