Riepilogo
Un programma imperativo non calcola il suo risultato tutto in una volta: lo costruisce per passi, conservando valori intermedi e modificandoli. Questa lezione studia il luogo in cui si conservano, la variabile, che è una cella di memoria con un nome, un tipo e un valore. Insegna a dichiararla e a inizializzarla con le graffe, e perché le graffe sono la forma preferita; a cambiarne il valore con l’assegnamento, il cui segno = non significa ciò che significa in matematica; a seguire lo stato di un programma, cioè il valore di tutte le sue variabili in ogni istante, con una tabella di traccia; a scegliere nomi che dicano ciò che la variabile conserva, e a evitare l’errore più silenzioso di questa fase: leggere una variabile a cui non si è mai dato un valore, il che in C++ è comportamento indefinito.
Obiettivi di apprendimento
- Dichiarare e inizializzare variabili con le graffe, e distinguere l’inizializzazione dall’assegnamento in un programma dato.
- Seguire a mano lo stato di un programma di assegnamenti successivi con una tabella di traccia, e prevederne così l’output.
- Scegliere nomi in inglese che dicano ciò che ciascuna variabile conserva, secondo le regole del linguaggio e la guida del corso.
- Spiegare perché leggere una variabile non inizializzata è comportamento indefinito, riconoscerlo in un programma e prevenirlo inizializzando sempre.
La variabile come cella
Nella lezione Dal problema all’algoritmo gli algoritmi sono stati scritti con lettere come e , che assumevano un valore e poi un altro: « assume il valore ». In matematica una lettera designa un valore fisso, benché sconosciuto; in un algoritmo, invece, designa un luogo il cui contenuto cambia. Un programma C++ ha bisogno della stessa cosa, e la ottiene dalla memoria del computer.
La memoria principale è una lunga successione di byte, ciascuno con il suo numero d’ordine, il suo indirizzo. Una variabile è un tratto di quella memoria a cui il programma dà un nome e un tipo. Ha, pertanto, quattro attributi:
- un nome, con cui il programma la designa (
count,price); - un tipo, che fissa quali valori può conservare, quanti byte occupa e quali operazioni ammette:
intconserva numeri interi,doublenumeri con decimali; - un valore, quello che conserva in un istante dato, che può cambiare mentre il programma viene eseguito;
- un luogo nella memoria, che il compilatore e il sistema scelgono e che il programma non ha quasi mai bisogno di conoscere.
L’immagine che conviene trattenere è quella di una cella: il nome scritto sopra, il valore dentro. Il tipo è la dimensione e la forma della cella; una cella di int non accetta 2.5, come una casella delle lettere non accetta un pacco. Le figure di questa lezione disegnano così lo stato di un programma, e lo ridisegnano dopo ogni istruzione.
Che il tipo fissi la dimensione si può vedere: l’operatore sizeof dà il numero di byte che occupa una variabile o un tipo.
#include <print>int main(){ const int count{12}; const double price{4.5}; std::println("count occupa {} byte", sizeof(count)); std::println("price occupa {} byte", sizeof(price));}count occupa 4 byteprice occupa 8 byteUn int occupa qui 4 byte, e un double, 8. Queste cifre non sono le stesse in tutti i sistemi, e da esse dipende quanti valori distinti entrano in ciascun tipo; le lezioni Gli interi e la loro rappresentazione e I numeri in virgola mobile lo studieranno. Qui basta l’essenziale: il tipo di una variabile si fissa quando la si dichiara e non cambia mai; ciò che cambia è il suo valore.
Caricamento del contenuto…