Associatività e precedenza degli operatori

Ecco un punto fondamentale della lezione. Queste cose vanno conosciute a memoria se si intende fare qualcosa seriemente altrimenti non si andrà facilmente oltre al 2 + 2.
Prima di tutto chiariamo cosa sono l'associatività e la precedenza.

Associatività e la precedenza di ogni operatore sono definite nel PHP esattamente come in algebra e ci permettono di scrivere espressioni complesse molto facilmente. L'interprete divide infatti tutti gli operatori che abbiamo visto in vari gruppi con priorità diversa.

Ad esempio il gruppo di precedenza A avrà priorità maggiore del gruppo B quindi quando verrà effettuata la valutazione dell'espressione per trovarne il risultato tutti gli operatori del gruppo A saranno applicati per primi.

Tramite l'associatività dei vari operatori l'interprete sa invece come comportarsi quando incontra due operatori che appartengono allo stesso gruppo di precedenza.

Qui di seguito riporto una piccola tabella con tutti gli operatori visti in lezione con la rispettiva associatività e gruppi di precedenza. Tutti gli operatori sono in ordine crescente quindi i primi sono quelli con precedenza piú bassa.

Associatività Operatori
Sinistra ,
Sinistra or
Sinistra xor
Sinistra and
Destra print
Sinistra = += -= *= /= .= %= &= |= ^= ~= <<= >>=
Sinistra ? :
Sinistra ||
Sinistra &&
Sinistra |
Sinistra ^
Sinistra &
Non associativi == != === !==
Non associativi < <= > >=
Sinistra << >>
Sinistra + - .
Sinistra * / %
Destra ! ~ ++ -- (int) (float) (string) (array) (object) @
Destra [
Non associativi new

Quando si vuole per qualche motivo forzare l'interprete a valutare un espressione prima delle altre basta racchiuderla tra parentesi tonde proprio come in matematica.

Le prime volte è utile anche costruirsi l'AST (abstract syntax tree) e fare una navigazione post-order dell'espressione per prendere familiarità con operatori, associatività e precedenza.

<?php
 
/* esempio di espressioni */
$a = 5 && 10;
$a = 5 and 10; /* questa espressione non ha lo stesso effetto della
                  precedente l'operatore and ha una precedenza
                  minore di quello di assegnazione */
 
$a = (5 and 10); // questa è corretta
 
$x = 10 + 4 * 2; /* il risultato è 18 e non 28.
                    l'operatore di moltiplicazione
	            ha priorità maggiore */
 
$k = ~$x++;      /* l'operatore "~" e "++" hanno la stessa
                    precedenza. Hanno associatività a destra
                    quindi il "++" viene applicato per prima */
 
$z = 4 + (4 * 2);
 
?>

AST e post-order dell'espressione precedente:

               +------------+
               |  <op-exp>  |
               +------------+
               7   / | \
                  /  |  \
                 /   |   \
             +---+ +---+ +-------------+
             | 4 | | + | |  <op-exp>   |
             +---+ +---+ +-------------+
              1     2    6    / | \
                             /  |  \
                            /   |   \
                        +---+ +---+ +---+
                        | 4 | | * | | 2 |
                        +---+ +---+ +---+
                         3    4     5

Inserisci un commento:


Il contenuto di questo campo è tenuto riservato e non verrà reso pubblico.

Condividi

Se ti piace questo articolo, puoi collegarlo al tuo sito copiando il seguente codice HTML nelle tue pagine.

Acquista libri di informatica

Acquista qui il tuo software

Ultimi commenti