Vai al contenuto
Topos Uranos

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

  1. Dichiarare e inizializzare variabili con le graffe, e distinguere l’inizializzazione dall’assegnamento in un programma dato.
  2. Seguire a mano lo stato di un programma di assegnamenti successivi con una tabella di traccia, e prevederne così l’output.
  3. Scegliere nomi in inglese che dicano ciò che ciascuna variabile conserva, secondo le regole del linguaggio e la guida del corso.
  4. 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 qq e rr, che assumevano un valore e poi un altro: «rr assume il valore r−br - b». 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:

  1. un nome, con cui il programma la designa (count, price);
  2. un tipo, che fissa quali valori può conservare, quanti byte occupa e quali operazioni ammette: int conserva numeri interi, double numeri con decimali;
  3. un valore, quello che conserva in un istante dato, che può cambiare mentre il programma viene eseguito;
  4. 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.

Programma in C++
#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));}
Output
count occupa 4 byteprice occupa 8 byte

Un 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.