Precedenza degli operatori in Java

Concetti Chiave
  • La precedenza degli operatori in Java determina l'ordine in cui gli operatori vengono valutati in un'espressione.
  • Gli operatori con precedenza più alta vengono valutati prima di quelli con precedenza più bassa.
  • Le parentesi possono essere utilizzate per modificare la precedenza degli operatori e rendere le espressioni più chiare.

Precedenza degli operatori

Un concetto importante da comprendere quando si scrivono espressioni in Java è la precedenza degli operatori. La precedenza determina l'ordine in cui gli operatori vengono valutati in un'espressione. Se non si tiene conto della precedenza, il risultato di un'espressione potrebbe non essere quello atteso.

Di seguito è riportata una tabella che mostra la precedenza degli operatori in Java, dalla più alta alla più bassa. Gli operatori con precedenza più alta vengono valutati prima di quelli con precedenza più bassa. Se due operatori hanno la stessa precedenza, l'ordine di valutazione dipende dalla loro associatività.

Precedenza Operatori Associatività
1 ++ (postfisso), -- (postfisso) da sinistra a destra
2 ++ (prefisso), -- (prefisso), ~, !, + (unario), - (unario), cast da destra a sinistra
3 *, /, % da sinistra a destra
4 +, - da sinistra a destra
5 >>, >>>, << da sinistra a destra
6 >, >=, <, <=, instanceof da sinistra a destra
7 ==, != da sinistra a destra
8 & da sinistra a destra
9 ^ da sinistra a destra
10 | da sinistra a destra
11 && da sinistra a destra
12 || da sinistra a destra
13 ?: (operatore condizionale) da destra a sinistra
14 -> (espressione lambda) da sinistra a destra
15 =, +=, -=, *=, /=, %= da destra a sinistra
Tabella 1: Operatori, precedenza e associatività in Java

Gli operatori presenti nella stessa riga hanno la stessa precedenza. Nelle operazioni binarie l'ordine di valutazione è da sinistra a destra (tranne che per l'assegnazione, valutata da destra a sinistra). Benché siano tecnicamente separatori, le parentesi quadre [], le tonde () e il punto . possono agire da operatori; in tal caso avrebbero la precedenza massima. Si noti, inoltre, l'operatore freccia (->) utilizzato nelle espressioni lambda.

Uso delle parentesi

Le parentesi innalzano la precedenza delle operazioni contenute al loro interno. Spesso è necessario usarle per ottenere il risultato desiderato. Per esempio, si consideri la seguente espressione:

a >> b + 3

L'espressione somma dapprima 3 a b e quindi effettua su a lo shift a destra del risultato. La stessa operazione può essere riscritta con parentesi ridondanti in questo modo:

a >> (b + 3)

Tuttavia, se si intende prima effettuare lo shift a destra di a di b posizioni e poi aggiungere 3 al risultato, occorre racchiudere fra parentesi l'espressione così:

(a >> b) + 3

Oltre a modificare la precedenza normale di un operatore, le parentesi possono essere utilizzate per rendere più chiaro il significato di un'espressione. Per chi legge il codice, un'espressione complessa può risultare difficile da comprendere. Aggiungere parentesi ridondanti ma chiarificatrici a espressioni complesse aiuta a prevenire confusione in seguito. Per esempio, quale delle seguenti espressioni è più facile da leggere?

a | 4 + c >> b & 7
(a | (((4 + c) >> b) & 7))

Un'ultima considerazione: le parentesi (ridondanti o meno) non degradano le prestazioni del programma. Pertanto, aggiungere parentesi per ridurre l'ambiguità non influisce negativamente sull'esecuzione.