domenica 12 ottobre 2025

GDScript - Operatori

Godot - GDScript Gli operatori in un linguaggio di programmazione sono simboli che eseguono operazioni su uno o più valori (operandi). Servono per manipolare dati, ad esempio effettuare calcoli matematici, confronti (maggire di, uguale a, ecc.), operazioni logiche o assegnare valori. Ogni linguaggio ha i propri operatori, ma molti sono simili tra loro.

Gli operatori che agiscono su un solo valore si chiamano operatori unari (per esempio -a cambia il segno del numero a), tutti gli altri agiscono su due operandi e si chiamano operatori binari.

Operatori matematici ed espressioni

Gli operatori matematici servono ad eseguire calcoli tra numeri. La valutazione delle espressioni aritmetiche segue le regole di precedenza dell'algebra (le stesse che si imparano a scuola): ci sono operazioni che vengono eseguite prima di altre. Vale quanto segue:

  1. la valutazione di un'espressione aritmetica avviene da sinistra verso destra;
  2. le espressioni tra parentesi hanno precedenza maggiore di quelle fuori parentesi;
  3. le parentesi si possono usare per modificare l'ordine di precedenza delle operazioni;
  4. l'operatore di esponenziazione (indicato con **) ha precedenza su tutti gli altri operatori. Tale operatore esegue l'elevamento di un numero a potenza.
    ESEMPIO: x = 2**3 ha come risultato x = 8  perché 23=8;
  5. l'operatore di negazione unaria (opposto di un numero, ossia cambio di segno) ha precedenza minore dell'esponenziazione ma maggiore di tutti gli altri operatori;
  6. moltiplicazione e divisione hanno precedenza inferiore alla negazione unaria ma maggiore rispetto ad addizione e sottrazione (salvo che non ci siano parentesi che modifichino la precedenza). Per es. 5+4*3-2 equivale a 5+(4*3)-2. L'operatore modulo, indicato col simbolo della percentuale %, ha la stessa precedenza di moltiplicazione e divisione. Tale operatore calcola il resto della divisione tra interi.
    ESEMPIO: x = 17 % 5 ha come risultato x = 2  perché 17:5=3 con resto 2;
  7. addizione e sottrazione hanno precedenza inferiore rispetto a moltiplicazione, divisione e modulo (salvo non intervengano parentesi a modificare l'ordine di precedenza);
  8. a parità di precedenza tra operatori vale la regola (1) ossia la valutazione da sinistra verso destra, per es. 6/3*4 equivale a (6/3)*4.

La seguente tabella elenca gli operatori a partire da quelli con precedenza maggiore (nella stessa casella vi sono gli operatori con pari precedenza):

OPERATORE DESCRIZIONE ESEMPIO
** esponenziazione (elevamento a potenza)
(massima precedenza)
x = x**3
x**3 equivale a x3
- (unario) negazione (opposto di un numero)
(precedenza inferiore rispetto a **)
a = -a
*  /  % moltiplicazione,
divisione,
modulo (resto della divisone tra interi)
(precedenza inferiore rispetto a - unario)
a = b * c,
a = b / c,
a = b % c
+  - addizione,
sottrazione
(precedenza inferiore rispetto a *  /  %)
a = b + c,
a = b - c

Precedenza ed uso delle parentesi

Nelle espressioni aritmetiche complicate, in caso di dubbi sulle precedenza degli operatori è conveniente usare le parentesi. L'uso di parentesi non rende inefficiente il programma perché il compilatore eliminerà in modo automatico quelle non necessarie; viceversa, l'uso di parentesi può aiutare a mantenere ordinato il codice e ad evitare errori accidentali.

Evitare errori di calcolo

Nelle espressioni aritmetiche bisogna prestare attenzione al tipo delle variabili a cui si assegnano i risultati delle operazioni. Ad esempio, usare l'esponenziazione per elevare a potenza un numero intero (base) ad un numero in virgola mobile (esponente), porta spesso a errori di troncamente del risultato.

Istruzioni di assegnazione abbreviate

Sono disponibili alcune scorciatoie di calcolo per assegnare valori alle variabili contemporaneamente all'uso di espressioni aritmetiche: tali scorciatoie hanno precedenza inferiore rispetto a tutti gli operatori aritmetici. L'uso di questo tipo di espressioni è frequente nelle istruzioni di ciclo (loop).

ESEMPIO OPERAZIONE EQUIVALENTE
a += 1 a = a+1
a -= 2 a = a-2
a *= 3 a = a*3
a /= 4 a = a/4
a %= 5 a = a%5
a **= 6 a = a**6

Operatori relazionali (o di confronto)

Gli operatori relazionali sono simboli utilizzati per confrontare due valori (operandi) e stabilire una relazione tra di essi. Il loro scopo è verificare se due valori sono uguali, diversi, maggiori, minori, maggiori o uguali, minori o uguali. Il risultato di un confronto tramite un operatore relazionale è un valore booleano (vero o falso).

OPERATORE DESCRIZIONE ESEMPIO RISULTATO
== uguale a x == x true
!= diverso da x != x false
> maggiore di y > y false
>= maggiore o uguale a y >= y true
< minore di z < z false
<= minore o uguale a z <= z true

Operatori booleani

Degli operatori booleani ordinari abbiamo discusso nel precedente aritcolo: operano sui valori di verità true (vero) oppure false (falso). Le operazioni base su operandi booleani sono:

  • not logico (negazione unaria): not a vale true se a è false, vale false se a è true;
  • or logico: a or b vale true se almeno uno degli operandi è true, altrimenti vale false;
  • and logico: a and b vale true se e solo se entrambi gli operandi sono true, altrimenti vale false.
Tabelle di verità booleani

Per ulteriori informazioni riferirsi alla documentazione ufficiale sugli operatori booleani: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_styleguide.html#boolean-operators

Operatori bit a bit

Gli operatori bit a bit operano in parallelo su tutti i bit degli operandi. Sono operatori di basso livello a cui corrispondono operazioni a livello di linguaggio macchina. Gli operatori bit a bit non vengono utilizzati molto spesso in Godot, a meno che non sia necessaria la manipolazione di singoli bit.

Ogni dato (numeri, caratteri ecc.) è costituito da bit binari, ossia da sequenze di 0 e 1: è possibile invertire i bit, farli scorrere, mascherarli, ecc. I singoli bit si possono impostare o azzerare in base a operazioni logiche correlate al funzionamento delle porte logiche digitali. Il primo bit di un dato è chiamato LSB (bit meno significativo) e l'ultimo bit è chiamato MSB (bit più significativo). 

Gli operatori bit a bit sono analoghi ai rispettivi operatori booleani, con la differenza che operano su ogni singolo bit del dato a cui sono applicati. Il bit 0 rappresenta il valore di verità "falso" e il bit 1 il valore "vero":

  • ~ (inversione del bit): ~a vale 1 se a è 0, vale 0 se a è 1. Il simbolo ~ si chiama "tilde" e sulla tastiera italiana si produce con la combinazione di tasti <ALT> + 126;
  • | (or logico bit a bit): a | b vale 1 se almeno uno degli operandi è 1, altrimenti vale 0;
  • & (and logico bit a bit): a & b vale 1 se e solo se entrambi gli operandi sono 1, altrimenti vale 0.
Operatori bit a bit

XOR (eXclusive OR) 

Un importante operatore bit a bit è l'XOR (or esclusivo), usato per particolari operazioni (per es. quelle di mascheramento dei bit, che hanno lo scopo di azzerare o di impostare a 1 determinati bit). L'XOR è un operatore binario che vale "vero" se uno solo egli operandi è "vero" mentre l'altro è "falso". In Godot il simbolo usato per l'XOR bit a bit è l'accento circonflesso ^. La corrispondente tabella di verità è la seguente:

XOR bit a bit

La proprietà dell'XOR bit a bit può essere sfruttata anche per scambiare il valore di due variabili senza ricorrere all'uso di celle di memoria temporanee (è un metodo interessante a livello teorico perché mostra come si può evitare di usare una variabile temporanea aggiuntiva e quindi risparmia memoria, ma computazionalmente è meno efficiente):

ESEMPIO (estendi l'area di testo se necessario):

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):


Operatori di spostamento (shift) dei bit

Gli operatori di spostamento sono operatori che spostano i bit che rappresentano un operando verso sinistra o verso destra.

OPERATORE NOME DESCRIZIONE
<< shift a sinistra sposta i bit verso sinistra
>> shift a destra sposta i bit verso destra

Ad esempio, nei numeri interi ogni singolo spostamento verso sinistra equivale a moltiplicare il numero per 2, mentre ogni singolo spostamento verso destra equivale a dividere il numero per 2; in generale:

  • lo spostamento dei bit di n posizioni verso sinistra equivale a moltiplicare il numero per 2n (nella rappresentazione binaria del numero vengono scartati gli n bit più a sinistra, mentre vengono aggiunti a destra n bit 0)
  • lo spostamento dei bit di n posizioni verso destra equivale a dividere il numero per 2n (nella rappresentazione binaria del numero vengono scartati gli n bit più a destra, mentre vengono aggiunti a sinistra n bit 0).
    NOTA: nella divisione vengono scartate le eventuali cifre decimali.

ESEMPIO (estendi l'area di testo se necessario):

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):


Valutazione cortocircuitata

Un'espressione contenente operatori logici viene valutata da sinistra a destra. Non appena la condizione o l'espressione che si sta valutando è necessariamente vera (oppure necessariamente falsa), il resto dell'espressione NON viene valutato in modo da rendere più rapida ed efficiente l'esecuzione. Ad esempio:

  • true or (un'espressione booleana qualsiasi, anche molto lunga) è necessariamente true;
  • false and (un'espressione booleana qualsiasi, anche molto lunga) è necessariamente false.

Quindi, quando si scrive il codice del programma, è conveniente, se possibile, ordinare le parti delle espressioni in modo che quelle più importanti o più veloci da valutare siano posizionate a sinistra.

Riepilogo

Abbiamo trattato gli operatori matematici, relazionali, booleani e bit a bit in ordine di utilità. Alcuni operatori GDScript sono stati esclusi da questa sezione poiché fanno parte di argomenti più avanzati.

Per ulteriori informazioni sugli operatori riferirsi alla documentazione ufficiale: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#operators

Precedente Indice Successivo