Precedente: , Su: Tutti gli operatori   [Contenuti][Indice]


6.2.4 Operatori di incremento e di decremento

Gli operatori di incremento e decremento incrementano o riducono il valore di una variabile di uno. Un operatore di assegnamento può fare la stessa cosa, per cui gli operatori di incremento non aggiungono funzionalità al inguaggio awk; in ogni caso, sono delle convenienti abbreviazioni per operazioni molto comuni.

L’operatore per aggiungere uno è ‘++’. Può essere usato per incrementare una variabile prima o dopo aver stabilito il suo valore. Per preincrementare una variabile v, si scrive ‘++v’. Questo aggiunge uno al valore di v; questo nuovo valore è anche il valore dell’espressione. (L’espressione di assegnamento ‘v += 1’ è totalmente equivalente.) Scrivendo ‘++’ dopo la variabile si specifica un postincremento. Questo incrementa il valore della variabile nello stesso modo; la differenza è che il valore dell’espressione d’incremento è il vecchio valore della variabile. Così, se pippo ha il valore quattro, l’espressione ‘pippo++’ ha il valore quattro, ma cambia il valore di pippo in cinque. In altre parole, l’operatore restituisce il vecchio valore della variabile, ma con l’effetto collaterale di incrementarlo.

Il postincremento ‘pippo++’ è quasi come scrivere ‘(pippo += 1) - 1’. Non è perfettamente equivalente perché tutti i numeri in awk sono in virgola mobile. In virgola mobile, ‘pippo + 1 - 1’ non è necessariamente uguale a pippo, ma la differenza è molto piccola finché si ha a che fare con numeri relativamente piccoli (inferiori a 1012).

I campi di un record e gli elementi di un vettore vengono incrementati proprio come le variabili. (Si deve usare ‘$(i++)’ quando si deve fare un riferimento a un campo e incrementare una variabile allo stesso tempo. Le parentesi sono necessarie a causa della precedenza dell’operatore di riferimento ‘$’.)

L’operatore di decremento ‘--’ funziona proprio come ‘++’, solo che sottrae uno anziché aggiungerlo. Come ‘++’, si può usare prima di lvalue per predecrementare o dopo per postdecrementare. Quel che segue è un sommario delle espressioni di incremento e di decremento:

++lvalue

Incrementa lvalue, restituendo il nuovo valore come valore dell’espressione.

lvalue++

Incrementa lvalue, restituendo il vecchio valore di lvalue come valore dell’espressione.

--lvalue

Decrementa lvalue, restituendo il nuovo valore come valore dell’espressione. (Quest’espressione è come ‘++lvalue’, ma invece di aggiungere, sottrae.)

lvalue--

Decrementa lvalue, restituendo il vecchio valore di lvalue come valore dell’espressione. (Quest’espressione è come ‘lvalue++’, ma invece di aggiungere, sottrae.)

Ordine di valutazione degli operatori

Dottore, quando faccio così mi fa male!
E allora non farlo!

Groucho Marx

Che cosa succede con qualcosa come questo?

b = 6
print b += b++

O con qualcosa di più strano ancora?

b = 6
b += ++b + b++
print b

In altre parole, quando hanno effetto i vari effetti collaterali previsti dagli operatori col suffisso (‘b++’)? Quando gli effetti collaterali si verificano è definito dall’implementazione. Per dirla diversamente, questo è compito di ogni specifica versione di awk. Il risultato del primo esempio può essere 12 o 13, e del secondo può essere 22 o 23.

In breve, è sconsigliato fare cose come questa e, in ogni caso, ogni cosa che possa incidere sulla portabilità. Si dovrebbero evitare cose come queste nei programmi.


Precedente: , Su: Tutti gli operatori   [Contenuti][Indice]