  |
Per calcolare le espressioni occorre considerare: |
  |
Precedenza, ovvero chi prevale tra due operatori diversi: |
Le espressioni sono composte da una sequenza di operatori alternati a operandi. Valgono le regole tradizionali della aritmetica, quelle che abbiamo imparato già dalla scuola elementare. Ci sono però alcuni concetti che vale la pena di ribadire per fissare le idee per fornire delle regole sicure su come vengono effettuati calcoli.
a + 2 * 3
// come va calcolato?
a + (2 * 3)
// * ha la precedenza su +
se vediamo la prima espressione, le regole della scuola elementare ci dicono che la moltiplicazione va fatta prima della somma. Questa semplice regole empirica viene tradotta nei linguaggi di programmazione con un la regola della precedenza. Ovvero quando un operando, in questo caso il 2, è conteso tra due operatori, in questo caso il + e il *, prevale chi ha la precedenza. Esiste una tabella, di seguito riportata, che dice l'ordine di precedenza degli operatori. Quindi in una espressione complessa alcuni operatori comandano su altri e inducono un ordine di esecuzione nei calcoli. Quest'ordine può essere ricavato semplicemente applicando le regole di precedenza. A volte è fondamentale applicarle a mano. Comunque nel dubbio si può sempre ricorrere a delle parentesi, che alterano la precedenza, e anche se sono ridondante non creano problemi.
  |
Associatività ovvero chi prevale con un solo operatore: |
la regola della precedenza si applica anche quando un operando è conteso tra due occorrenze dello stesso operatore. In questo caso si parla però di precedenza ma di associatività. In generale l'associatività dice che si devono fare calcoli da destra verso sinistra, o da sinistra verso destra.
a + b + c
// come va calcolato?
(a + b ) + c
// + associa da destra
a = b = c
// come va calcolato?
a = ( b = c)
// = associa da sinistra
in pratica in Java sono rilevanti solamente due casi, il caso in cui si vuole fare un calcolo, e il caso in cui si vuole assegnare un risultato. Nel primo caso, come si vede dalla figura, il calcolo procede da sinistra verso destra come ci si aspetterebbe. Secondo caso invece, siccome si vuole che il valore assegnato risalga verso la variabile, l'associatività è da destra verso sinistra. Il caso dell'assegnamento può sembrare strano, almeno per chi viene da linguaggi diversi dal C. Vediamolo meglio.
  |
Effetti collaterali: |
a = 1
// espressione, vale 1
// come effetto collaterale di =
// a viene modificata
a = b = 1
// ad a assegno il valore di (b = 1)
a = int b = 1
// ERRORE!
// int b (inizializzazione)
// non è una espressione
una delle caratteristiche del Java è il fatto che le espressioni permettono la modifica delle variabili. Questa caratteristica che che è dedicato dal linguaggio C. Ricordiamo infatti che Java è una versione semplificata del linguaggio C++, che a sua volta che un'estensione del C. Comunque sia, il concetto fondamentale e che ci sono operatori che possono modificare le variabili. Normalmente si pensa che un operatore fatto solo un calcolo, come nel caso di a + 1. In questo caso non c'è niente di speciale: viene effettivamente sommato 1 al valore di a.
Ma nel caso a = 1, le cose sono un pò più strane. Si tratta
effettivamente di un operatore, che fa un calcolo, ma questo calcolo è
la funzione identità, ovvero a = 1 ritorna semplicemente il valore del
secondo operando, ovvero 1. Cioè a = 1 quale 1, come a + 1 vale 2, se
a è 1. Allora ci può chiedere il senso del fare un'operazione come a =
1. La ragione di quest'operazione sta che fatto che l'uguale ha un
effetto collaterale, che è quello di assegnare il valore del secondo
operando al primo. Infatti di operando di = dev'essere un lvalue. In
gergo significa un valore assegnabile, una variabile in pratica, o un
elemento di una schiera. Possiamo adesso quindi esaminare maggior
dettaglio a = b = 1. Succede che applicando la regola della
associatività, viene eseguito per primo b = 1. Quest'espressione vale
1 e modifica b. A questo punto si calcola a = [risultato], ottenendo
come valore [risultato], e assegnando questo [risultato] ad a. In
definitiva in questo modo si assegnano ad a e b il valore 1.
|