Operatori di base

Di seguito è presentata una lista volutamenteincompleta degli operatori che Java ci mette a disposizione.Per alcuni di essi, l’utilizzo è alquantoraro.

- Operatored’assegnazione:     =

- Operatori aritmetici :

               somma                      +

               sottrazione            -

               moltiplicazione       *

               divisione                   /

               modulo                        %

L’unico operatore che può risultare nonfamiliare al lettore, è l’operatore modulo. Ilrisultato dell’operazione modulo tra due numeri,coincide con il resto della divisione fra essi. Peresempio

    5%3=2

    10%2=0

    100%50=0

 Dalla sintassi del linguaggio C, Java ha ereditatoanche altri operatori unari (con un solo operando) che, oltreche svolgere un’operazione, assegnano anche il valoredel risultato ad una variabile utilizzatanell’operazione:

               somma eassegnazione                             +=

               sottrazione eassegnazione           -=

               moltiplicazione eassegnazione        *=

               divisione eassegnazione            /=

               modulo eassegnazione                                %=

In pratica se abbiamo:

int i=5;

scrivere:

i=i+2;

è equivalente a scrivere:

i+=2;

- Operatori di pre e post-incremento

               incremento diun’unità                        ++ (pre e post)

               decremento diun’unità            -- (pre e post)

Se vogliamo incrementare di una sola unità unavariabile numerica, posso equivalentemente scrivere:

i=i+1;

oppure:

i+=1;

ma anche:

i++;

oppure:

++i;

ottenendo comunque lo stesso risultato. Infatti, in tuttii casi, otterremo che il valore della variabile i,è stato incrementato di un’unità, edassegnato nuovamente alla variabile stessa. Quindi anchequesti operatori svolgono due compiti (incremento edassegnazione). Parleremo di operatore di pre-incremento nelcaso in cui anteponiamo l’operatored’incremento ++ alla variabile. Parleremoinvece, di operatore di post-incremento nel caso in cuiposponiamo l’operatore di incremento alla variabile. Ladifferenza tra questi due operatori "composti" ,consiste essenzialmente nelle priorità che essi hannorispetto all’operatore di assegnazione.L’operatore di pre-incremento, ha maggiorepriorità dell’operatore di assegnazione=. L’operatore di post-incremento, ha minorpriorità rispetto all’operatore diassegnazione =.

Il seguente esempio rende visibile la differenza tra i dueoperatori:

pre-incremento

 

x = 5;    y = ++x;

si ha x=6 e y=6

post-incremento

 

x = 5;    y = x++;

si ha x=6 e y=5

- Operatori bitwise:

               NOT                                                                          ~

               AND                                                                        &

               OR                                                                               |

               XOR                                                                            ^

               shift asinistra                                       <<

               shift adestra                                                                >>

               shift a destra senzasegno                                                    >>>

               AND eassegnazione                                                        &=

               OR eassegnazione                                                          |=

               XOR eassegnazione                                                        ^=

               shift a sinistra eassegnazione                                         <<=

               shift a destra eassegnazione                                           >>=

               shift a destra con riempimento di zeri eassegnazione             >>>=

Tutti questi operatori binari, sono molto efficientigiacché agiscono direttamente sui bit, ma in Java siutilizzano raramente. L’operatore NOT ~ èun cosiddetto operatore unario, dato che si applica ad unsolo operando.

Gli operatori AND &, OR |, e XOR ^, siapplicano a coppie di operandi, e svolgono le relativeoperazioni logiche di conversioni di bit riassunte nelleseguente tabella:

 

Operando1

Operando2

Op1ANDOp2

Op1OROp2

Op1XOROp2

0

0

0

0

0

0

1

0

1

1

1

0

0

1

1

1

1

1

1

0


 

Gli operatori di shift, provocano lo scorrimento verso unadirezione, dei bit della rappresentazione binaria di un certonumero. Il numero dei bit da scorrere è rappresentatodall’operando a destra dell’operazione. I bit chedopo lo scorrimento si trovano al di fuori dellarappresentazione binaria del numero, vengono eliminati. I bitche invece "rimangono vuoti" vengono riempiti con ivalori 0 oppure 1 a seconda del caso. Inparticolare, lo scorrimento a sinistra provoca un riempimentocon i valori 0, per i bit lasciati vuoti sulla destra dellarappresentazione binaria del numero. Anche lo scorrimento adestra senza segno riempie i bit lasciati vuoti con degli 0.Lo scorrimento a destra con segno invece, provoca ilriempimento di 0 oppure di 1, a seconda che l’ultimacifra a sinistra prima dello scorrimento (bit del segno) sia0 oppure 1, ovvero che la cifra prima dello scorrimento siapositiva o negativa. Consideriamo i seguenti esempi:

 

byte a=35; byte b=-8;    a = a>>2; b = b>>1;

 

rappresentazioni binarie

    00100011 35 11111000 -8

    >>2 >>1

    00001000 8 11111100 -4

 

 

 

int a = -1;    a = a>>>24;

 

    11111111111111111111111111111111 -1

    >>>24

    00000000000000000000000011111111 255

Possiamo notare che l’operazione di scorrimento asinistra equivale, a dividere l’operando di sinistra,per 2 elevato l’operando situato alla destradell’operazione. Similmente, l’operazione discorrimento a destra equivale a moltiplicare l’operandodi sinistra per 2 elevato l’operando situato sulladestra dell’operazione. Il risultato viene arrotondatoper difetto nelle operazioni con resto.

- Operatori relazionali o di confronto

Il risultato di queste operazioni è sempre unvalore boolean, ovvero true o false.

        ugualea                                    ==                               tutti i tipi

        diversoda                                    !=                                tutti i tipi

       maggiore                                       >                                 solo i tipi numerici

       minore                                      <                                 solo i tipi numerici

        maggiore ouguale                        >=                               solo i tipi numerici

        minore ouguale                        <=                              solo i tipi numerici

 Notiamo che se confrontiamo due reference conl’operatore ==, il risultatorisulterà true se e solo se i due referencepuntano allo stesso oggetto, false altrimenti. Unclassico errore che l’aspirante programmatore commettespesso, è quello di scrivere = in luogo di==.

- Operatori logico - booleani

I seguenti sono operatori che utilizzano solo operandi ditipo booleano, ed il risultato è di tipoboolean:

        NOTlogico                                !

        ANDlogico                            &

        ORlogico                               |

        XORlogico                            ^

        short circuitAND                   &&

        short circuitOR                      ||

        AND eassegnazione               &=

        OR eassegnazione                  |=

        XOR eassegnazione                    ^=

E’ consuetudine utilizzare le versioni short circuitdi AND ed OR. Ad esempio, la seguente riga dicodice, mostra come avvantaggiarsi della valutazione logicadi corto circuito per essere certi che il risultato di unaoperazione di divisione sia valido prima di valutarlo:

boolean flag = (a!=0 && b/a>10)

Affinché l’espressione tra parentesi siavera, bisogna che entrambi gli operandi siano veri. Se ilprimo tra loro è in partenza falso, non ha sensoandare a controllare la situazione dell’altro operando.In questo caso addirittura sarebbe dannoso essendoci ilrischio di una divisione per zero. Quest'operatore short– circuit, a differenza della sua versionetradizionale, fa evitare il secondo controllo in caso difallimento del primo. Equivalentemente l'operatore short- circuit ||, nel caso la prima espressione da testarerisultasse verificata, convalida l'intera espressione,senza nessun'altra (superflua) verifica.

 

- Concatenazione di stringhe con +

In Java l’operatore +, oltre che ad essere unoperatore aritmetico, è anche un operatore perconcatenare stringhe. Per esempio il seguente frammento dicodice:

 

String nome = "James ";    String cognome = "Gosling";    String nomeCompleto = "Mr. " + nome + cognome;

 

farà in modo che la stringa nomeCompleto,avrà come valore "Mr. James Gosling".

N.B.: se "sommiamo" un qualsiasi tipo di datocon una stringa, il tipo di dato sarà automaticamenteconvertito in stringa, e ciò può risultaremolto utile.

- Priorità degli operatori

Nella seguente tabella sono riportati, in ordine dipriorità, tutti gli operatori di Java. Alcuni di essinon sono ancora stati trattati.

 

Separatori

. [] () ; ,

da sx a dx

++ -- + - ~ ! (tipi di dati)

Da sx a dx

* / %

Da sx a dx

+ -

Da sx a dx

<< >> >>>

Da sx a dx

< > <= >= instanceof

Da sx a dx

== !=

Da sx a dx

&

Da sx a dx

^

Da sx a dx

|

Da sx a dx

&&

Da sx a dx

||

Da dx a sx

?:

da dx a sx

= *= /= %= += -= <<= >>= >>>= &= ^= |=


 

Il lettore non si spaventi! Non è necessarioconoscere a memoria tutte le priorità per programmare.Nell’incertezza, si possono sempre utilizzare leparentesi tonde così come faremmonell’aritmetica tradizionale.