Conosce gli operatori ci servirà, indovinate un po’ per fare delle operazioni!
Ma non solo le classiche operazioni di somma, divisione ecc… ma anche a fare controlli sul valore di certe variabili, controlli sullo stato di una stringa e molte altre cose.
Per esempio con l’operatore == potremmo verificare se una stringa è come la vogliamo noi, tipo:
if(nome=="Mario") { fai questo } else { fai quest'altro }
Ricordiamo una cosa che abbiamo detto in una passata lezione: Quando si usa un solo simbolo uguale si sta facendo un’assegnazione, ovvero si sta impostano pippo uguale a 5. Quando invece si useranno due simboli uguale uno dopo l’altro si sta facendo un controllo, in pratica ci si sta chiedendo: pippo è uguale a 5? |
Gli operatori sono dunque dei simboli, per lo più intuitivi.
Conosciamo tutti il simbolo uguale, il più e il meno ecc… Essi sono simboli aritmetici.
Non credo ci possano essere difficoltà nel comprendere questo tipo di operazione:
int somma = 5+8;
Abbiamo usato l’operatore + e l’operatore =.
Il risultato è ovviamente un numero intero (int) uguale a 13.
Gli operatori però non sono quelli che abbiamo conosciuto alle elementari, essi si dividono in diverse tipologie. Noi vedremo tutte e cinque le tipologie, ma non vi preoccupate, non sono così complessi come potrebbe sembrare leggendo i loro nomi:
-
aritmetici
-
di confronto
-
logici
-
aritmetici composti
-
unitari
Iniziamo da quelli aritmetici di cui siamo già a conoscenza.
Operatori aritmetici
Operatori aritmetici | |
OPERAZIONE | SIMBOLO |
Addizione | + |
Sottrazione | – |
Moltiplicazione | * |
Divisione | / |
Modulo(resto) | % |
Questi 5 operatori già li conosciamo perché li abbiamo studiati tutti a scuola a parte, forse, l’ultimo (%).
Potremmo fare operazioni anche con le variabili oltre che, ovviamente, con i numeri.
Se per esempio avessimo :
int numeroA = 5;
int numeroB = 8;
potremo sommare le due variabili ed ottenere una nuova variabile dello stesso tipo così:
int somma= numeroA+numeroB;
oppure potremmo fare la stessa cosa sommando una variabile direttamente ad un numero:
int somma= numeroA + 8;
Nel nostro caso la variabile di tipo int, somma avrà come risultato sempre 13;
Proviamo a giocare un po’ con il codice su uno script attaccato ad un gameObject.
Prendiamo la nostra sfera creata in precedenza, posta in una scena vuota con attaccato lo script chiamato NuovoScript.cs.
Come detto possiamo sommare variabili dello stesso tipo senza problemi, ma non solo. Potremo fare delle operazioni aritmetiche anche tra i diversi tipi di dati numerici. A volte però sarà necessario operare delle conversioni, dette anche cast.
Abbiamo visto per esempio i numeri interi (int) e i numeri con virgola (float).
Ricordiamoci che per dichiarare un numero float dobbiamo scrivere la lettera f dopo il numero.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NuovoScript : MonoBehaviour { //Dichiariamo le 3 variabili che ci serviranno public int numeroA = 5; //Numero di tipo int public float numeroB = 8.2f; //Numero di tipo float public float somma; //Notare che la somma sarà di tipo float //Eseguiamo tutto dentro al metodo Start, così che appena avviata la scena //vedremo il risultato della nostra operazione void Start() { //La terza variabile sarà la somma delle due precedenti variabili somma= numeroA+numeroB; //Stampiamo il risultato sulla console print(somma); }//Chiusura metodo Start }
Incollare questo codice nello script e vedrete il risultato sulla console. Appena premeremo Play su Unity lo script verrà eseguito.
Avendo posto l’operazione dentro al metodo Start(), appena la scena inizierà, verrà effettuata la nostra operazione.
Questo codice farà semplicemente una la somma delle due variabili numeriche numeroA più numeroB e andrà a “salvare” il risultato nella variabile somma che poi potremmo visualizzare sulla console di Unity con la riga
print(somma);
Il risultato di 5 + 8.2 è 13.2.
Tutto funziona correttamente.
Abbiamo dichiarato subito che il risultato (cioè la variabile somma) sarà di tipo float perché ovviamente, sommando un numero con virgola ad uno senza, il risultato avrà la virgola.
Questo codice non produrrà errori proprio perché abbiamo dichiarato che vogliamo che la variabile somma sia di tipo float.
Ma se avessimo dichiarato che il risultato (sempre la variabile somma) doveva essere un numero intero, così? :
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NuovoScript : MonoBehaviour { //Dichiariamo le 3 variabili che ci serviranno public int numeroA = 5; //Numero di tipo int public float numeroB = 8.2f; //Numero di tipo float public int somma; // Questa volta però vogliamo che il valore somma sia un intero void Start() { //Facciamo la somma delle due variabili somma= numeroA+numeroB; //Stampiamo il risultato sulla console print(somma); }//Chiusura del metodo Start }
Questo codice produrrà un errore:
Impossibile convertire in modo implicito il tipo ‘float’ in ‘int’. È presente una conversione esplicita. Probabile cast mancante.
L’errore dice tutto. E’ impossibile convertire float in int implicitamente , cioè “senza scriverlo in modo chiaro”.
Dunque, quando incorrerà questo errore, dovremo fare una conversione di nostro pugno.
Nulla di più facile.
Conversione del tipo di variabili (cast)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NuovoScript : MonoBehaviour { //Dichiariamo le 3 variabili che ci serviranno public int numeroA = 5; //Numero di tipo int public float numeroB = 8.2f; //Numero di tipo float public int somma; // Vogliamo che il valore somma sia un intero void Start() { //Facciamo la somma delle due variabili, questa volta facendo un cast (una conversione) somma= (int)(numeroA+numeroB); //Stampiamo il risultato sulla console print(somma); }//Chiusura del metodo Start }
Abbiamo cambiato solo questa riga:
somma=(int)(numeroA+numeroB);
In questo modo effettueremo correttamente la conversione, ovvero, dato che il risultato sarebbe stato 13,2, verrà convertito nel numero intero 13, sarà cioè arrotondato nell’intero più vicino.
Le conversioni tra i diversi tipi di dato, sono un argomento che dovrà essere approfondito ed avrà bisogno di una lezione completa.
Dunque, nel caso dei numeri, per fare un cast sarà sufficiente scrivere il tipo che vorremmo ottenere davanti al risultato.
% operazione resto
Le operazioni di addizione, sottrazione, divisione e moltiplicazione le conosciamo, ma forse non conoscete l’operatore % (resto).
Tale operazione non fa altro che restituire il resto di una divisione, se per esempio avessimo diviso 25 per 2, ma al posto dell’operatore di divisione / avessimo usato l’operatore % il risultato sarebbe 1, perché 25/2 fa 12 con il resto di 1. Tale operatore ci restituisce dunque, il resto di una divisione.
Non lo useremo molto, ma è giusto sapere che esiste.
4 pensieri su “Gli Operatori Aritmetici”
Alla sola somma di NumeroA+NumeroB, pur eseguendola, in console compaiono questi 2 errori:
Internal: JobTempAlloc has allocations that are more than 4 frames old – this is not allowed and likely a leak
To Debug, enable the define: TLA_DEBUG_STACK_LEAK in ThreadsafeLinearAllocator.cpp. This will output the callstacks of the leaked allocations
Cosa significa? Come risolvere?
Ciao Cristian,
non avendo il codice in questione non so esattamente quale sia il tuo problema specifico, dove vai a fare l’operazione e altre variabili che potrebbero influenzare.
L’errore che ti riporta è un errore interno che può dipendere da diversi fattori ma che non dovrebbe apparire se si fa una semplice somma in un metodo come Start. Si tratta di un errore che riguarda i Jobs di Unity.
Di norma il motivo dell’avvertimento su TempJobAllocation accade quando il lavoro da te richiesto (i Jobs) richiede “troppo tempo” (più di 4 frame).
Il motivo principale per cui un’operazione impiega “tanto tempo” è che l’operazione fa un’allocazione gestita che è estremamente costosa in termini di prestazioni e spesso rende la soluzione dell’operazione più lenta rispetto all’esecuzione del codice a thread singolo. Dunque immagino che te stia lavorando con gli Unity.Jobs.
La soluzione per questo sarebbe assicurarsi di chiamare IsComplete per attendere il completamento delle operazioni (i Jobs) che occupano più di 4 frame.
Richiamare “IsComplete” è necessario anche per pulire i dati per il sistema di sicurezza, quindi è davvero necessario chiamarlo.
Ma come detto, la mia risposta è piuttosto generica perché non ho il codice sotto mano per visionarlo e testarlo così da capire meglio dove sia il problema.