Successivo: , Precedente: , Su: Espressioni   [Contenuti][Indice]


6.5 Precedenza degli operatori (Come si nidificano gli operatori)

La precedenza degli operatori determina come gli operatori vengono raggruppati quando diversi operatori appaiono uno vicino all’altro in un’espressione. Per esempio, ‘*’ ha una precedenza più alta di ‘+’; così, ‘a + b * c’ moltiplica b e c, e poi aggiunge a al prodotto (ovvero esegue ‘a + (b * c)’).

La normale precedenza degli operatori può essere cambiata usando delle parentesi. Si possono vedere le regole di precedenza come un modo per indicare dove si sarebbero dovute mettere delle parentesi. Di fatto, è cosa saggia usare sempre le parentesi in presenza di una combinazione di operatori insolita, perché altre persone che leggono il programma potrebbero non ricordare quale sia la precedenza in quel particolare caso. Anche dei programmatori esperti a volte dimenticano le regole esatte, il che porta a commettere errori. Usare esplicitamente le parentesi previene qualunque errore di questo tipo.

Quando vengono usati insieme operatori con uguale precedenza, quello più a sinistra viene raggruppato per primo, ad eccezione degli operatori di assegnamento, condizionali e di elevamento a potenza, che vengono raggruppati nell’ordine opposto. Quindi, ‘a - b + c’ raggruppa come ‘(a - b) + c’ e ‘a = b = c’ raggruppa come ‘a = (b = c)’.

Normalmente la precedenza degli operatori unari di prefisso non ha importanza, perché c’è un solo modo di interpretarli: prima il più interno. Quindi, ‘$++i’ significa ‘$(++i)’ e ‘++$x’ significa ‘++($x)’. Tuttavia, quando un altro operatore segue l’operando, la precedenza degli operatori unari può avere importanza. ‘$x^2’ significa ‘($x)^2’, ma ‘-x^2’ significa ‘-(x^2)’, perché ‘-’ ha precedenza più bassa rispetto a ‘^’, mentre ‘$’ ha precedenza più alta. Inoltre, gli operatori non possono essere combinati in modo tale da violare le regole di precedenza; per esempio, ‘$$0++--’ non è un’espressione valida perché il primo ‘$’ ha precedenza più alta di ‘++’; per evitare il problema l’espressione può essere scritta come ‘$($0++)--’.

Questa lista illustra gli operatori di awk, in ordine di precedenza dalla più alta alla più bassa:

()

Raggruppamento.

$

Riferimento a un campo.

++ --

Incremento, decremento.

^ **

Elevamento a potenza. Questi operatori sono raggruppati da destra verso sinistra.

+ - !

Più, meno, “not” logico, unari.

* / %

Moltiplicazione, divisione, resto di una divisione.

+ -

Addizione, sottrazione.

Concatenazione di stringhe

Non c’è un simbolo speciale per la concatenazione. Gli operandi sono semplicemente scritti uno accanto all’altro. (vedi la sezione Concatenazione di stringhe).

< <= == != > >= >> | |&

Operatori relazionali e ridirezione. Gli operatori relazionali e le ridirezioni hanno lo stesso livello di precedenza. I caratteri come ‘>’ servono sia come operatori relazionali che come ridirezioni; la distinzione tra i due significati dipende dal contesto.

Si noti che gli operatori di ridirezione I/O nelle istruzioni print e printf appartengono al livello dell’istruzione, non alle espressioni. La ridirezione non produce un’espressione che potrebbe essere l’operando di un altro operatore. Di conseguenza, non ha senso usare un operatore di ridirezione vicino a un altro operatore con precedenza più bassa senza parentesi. Tali combinazioni generano errori di sintassi (p.es., ‘print pippo > a ? b : c’). Il modo corretto di scrivere quest’istruzione è ‘print pippo > (a ? b : c)’.

~ !~

Corrispondenza, non corrispondenza.

in

Appartenenza a un vettore.

&&

“and” logico.

||

“or” logico.

?:

Operatore condizionale. Questo operatore raggruppa da destra verso sinistra.

= += -= *= /= %= ^= **=

Assegnamento. Questi operatori raggruppano da destra verso sinistra.

NOTA: Gli operatori ‘|&’, ‘**’ e ‘**=’ non sono definiti da POSIX. Per la massima portabilità, è meglio non usarli.


Successivo: , Precedente: , Su: Espressioni   [Contenuti][Indice]