# Variabili Una variabile, all'interno di un programma, rappresenta una porzione di **memoria** (RAM \- Random Access Memory), ovvero la memoria volatile del sistema in cui vengono temporaneamente archiviati i dati necessari all'**esecuzione** del programma stesso. Questa memoria è accessibile direttamente dalla CPU, permettendo operazioni veloci su dati e istruzioni. Quando si dichiara una variabile, il compilatore riserva un blocco specifico di questa memoria, assegnandogli un nome e una dimensione fissa, determinata dal tipo di dato. ## Regole per la denominazione delle variabili: Per quanto riguarda la scelta del nome di una variabile, esistono precise regole sintattiche da rispettare: 1. **Caratteri ammessi**: I nomi delle variabili possono essere costituiti da lettere dell'alfabeto (sia maiuscole che minuscole), numeri e il carattere di sottolineatura (`_`). Tuttavia, i numeri non possono essere utilizzati come primo carattere. 2. **Primo carattere**: Il nome di una variabile deve iniziare con una lettera o un carattere di sottolineatura (`_`). Non è consentito iniziare con un numero o con simboli speciali. 3. **Case-sensitive**: I nomi delle variabili sono sensibili al maiuscolo/minuscolo. Ciò significa che nomi come *variabile* e *Variabile* sono distinti e si riferiscono a entità diverse. 4. **Parole riservate**: Non è possibile utilizzare come nome di variabile parole riservate dal linguaggio, come quelle che appartengono alla sintassi del compilatore, quali, ad esempio, quelle che definiscono tipi di dati, operatori o strutture di controllo. 5. **Lunghezza del nome**: Sebbene non ci sia un limite stretto sulla lunghezza del nome di una variabile, è pratica comune utilizzare nomi chiari e significativi, evitando eccessive lunghezze, per mantenere il codice leggibile e gestibile. ## Dimensione e tipo di dato: Ogni variabile è associata a un tipo di dato che determina: * **Il tipo di valori** che la variabile può contenere (numeri interi, caratteri, numeri a virgola mobile, ecc.); * **La quantità di memoria** occupata, che è fissa e dipende dal tipo di dato. Ad esempio, una variabile che rappresenta un numero intero potrebbe occupare 4 byte di memoria, mentre una che rappresenta un carattere ne occupa 1\. L'assegnazione della memoria e la gestione dei tipi di dato vengono gestite dal **compilatore** in modo efficiente, garantendo che ciascuna variabile abbia lo spazio necessario per contenere i dati che le possono essere assegnati, senza eccedere o sottoutilizzare la memoria disponibile. ## Operazioni Sulle Variabili in C++ ### Dichiarazione delle Variabili La **dichiarazione** di una variabile consiste nel riservare spazio in memoria per una specifica quantità di dati e nel definire il tipo di dati che verranno memorizzati. La dichiarazione stabilisce il nome della variabile e il tipo che contiene. In C++ si può dichiarare una variabile come segue: ```c int numero; ``` In questo caso, abbiamo dichiarato una variabile di tipo *`int`* chiamata *`numero`*. È importante sapere che, al momento della dichiarazione, la variabile **non è inizializzata** automaticamente. Questo significa che essa conterrà un valore casuale, spesso indicato come "garbage value". Questo valore è ciò che è presente nella locazione di memoria in cui la variabile è stata allocata al momento della dichiarazione. Per evitare comportamenti imprevedibili, è sempre una buona pratica **inizializzare** le variabili, come nell'esempio seguente: ```c int numero = 0; ``` In questo modo, la variabile *`numero`* viene dichiarata e inizializzata a zero, eliminando l'incertezza di valori casuali. ### Assegnamento L'**assegnamento** di una variabile implica il dare un valore a una variabile già dichiarata. Si utilizza l'operatore di assegnamento `=` per mettere un nuovo valore nella variabile. Ad esempio: ```c numero = 5; ``` In questo caso, assegniamo il valore `5` alla variabile `numero`. È importante distinguere tra dichiarazione e assegnamento: mentre la dichiarazione riserva lo spazio in memoria, l'assegnamento scrive effettivamente un valore in quella memoria. ### Lettura La **lettura** di una variabile consiste nell'accesso al valore attualmente contenuto nella variabile stessa. Questo viene fatto in modo implicito ogni volta che si utilizza il nome della variabile in un'espressione. Ad esempio: ```c int risultato = numero + 10; ``` In questo esempio, il valore della variabile *numero* viene letto e utilizzato per calcolare *risultato*, che conterrà *numero \+ 10\.* ## Gestione della Memoria: Allocazione delle Variabili In C++, le variabili locali sono tipicamente allocate in una parte della memoria dedicata al programma chiamata "stack". Questa memoria viene automaticamente riservata e rilasciata dal sistema quando si **entra** e si **esce dal contesto in cui la variabile è dichiarata** (come una funzione o un blocco di codice). L'allocazione di memoria in questo modo è molto efficiente, ma implica che la dimensione della variabile e la sua durata siano fisse. Le variabili dichiarate all'interno di una funzione esistono solo mentre la funzione è in esecuzione, e vengono distrutte quando la funzione termina. Ad esempio: ```c int x = 7; // la variabile 'x' viene allocata sullo stack if( x>5 ){ int a = 10; // la variabile 'a' viene allocata sullo stack // 'a' esiste solo all'interno di questo blocco di codice } // qui la variabile 'a' non esiste più ma // la variabile 'x' continua ad esistere ``` Alla fine della funzione, la memoria allocata per *a* viene automaticamente rilasciata. Questo tipo di gestione della memoria rende l'uso dello stack particolarmente veloce e utile per variabili temporanee. ## ## Inizializzazione delle Variabili: Importanza e Pericoli Un aspetto fondamentale da considerare è che le variabili **non inizializzate** possono contenere qualsiasi valore. Questo è un comportamento potenzialmente pericoloso perché utilizzare una variabile non inizializzata in un calcolo potrebbe portare a risultati imprevedibili, difficili da tracciare e correggere. Ad esempio: ```c int b; // variabile non inizializzata cout << b << endl; // il valore di 'b' è indeterminato, potrebbe essere qualunque cosa ``` È una buona pratica, soprattutto per evitare errori imprevedibili e bug difficili da trovare, inizializzare sempre le variabili al momento della loro dichiarazione. L'inizializzazione fornisce un punto di riferimento chiaro e sicuro da cui partire.