#define PIGRECO 3.141592
PIGRECO
con 3.141592
. Tale modo di procedere era comodo ed efficace per un linguaggio a basso livello come il C, ma del tutto insufficiente e pericoloso per il più astratto C++. Nelle ultime versioni del C, comunque, le variabili costanti sono state introdotte di riflesso dal C++, pur con una implementazione leggeremente diversa. Noi comunque ci occuperemo unicamente delle variabili costanti in C++. Si veda il seguente esempio:
// ex4_2_1.cpp #include <iostream.h> void main() { int a = 5; const int b = 5; int c = b; // const int d; // ERRORE: le variabili costanti // devono essere inizializzate a = 10; // b = 10; // ERRORE: non si puo' modificare il // valore di una costante cout << a << '\t' << b << '\t' << c; }output:
10 | 5 | 5 |
Se si prova a compilare il programma togliendo il commento nello statement b = 10
si ottiene un errore da parte del compilatore, perché non è possibile, come abbiamo detto, modificare il valore di una variabile costante4.6. Le costanti devono essere inizializzate, poiché per esse non è definito l'operatore di assegnamento. In qualunque programma è utile avere delle costanti che sappiamo essere fisse sempre e comunque, perché il loro uso evita il diffondersi dei cosiddetti numeri magici, ossia costanti letterali numeriche dal significato esoterico per tutti tranne il programmatore stesso. Vediamo i seguenti esempi:
// ex4_2_2.cpp #include <iostream.h> void main() { const double PIGRECO = 3.141592; double raggio; cout << "raggio? "; cin >> raggio; double area = raggio * raggio * PIGRECO; cout << "l'area e' " << area; }
esempio di output:
raggio: 10
l'area e' 314.159
Il numero si presta molto bene ad essere rappresentato come una costante, in quanto esso è matematicamente ben definito. Si noti che le costanti, per convenzione universalmente accettata, usano identificatori con caratteri esclusivamente in maiuscolo. Prendiamo il seguente esempio:
// ex4_2_3.cpp #include <iostream.h> void main() { const int N_COMPITI_IN_CLASSE = 3; double totale = 0; for (int i = 1; i <= N_COMPITI_IN_CLASSE; i++) { double voto; cout << "voto compito in classe n. " << i << "? "; cin >> voto; totale += voto; } double media = totale / N_COMPITI_IN_CLASSE; cout << "media: " << media; if (media < 6) cout << "\nstudiare non fa poi cosi' male..."; else if ( (media >= 6) && (media < 7) ) cout << "\nchi si contenta gode..."; else if ( (media >= 7) && (media < 8) ) cout << "\ncontinua cosi' :-)"; else cout << "\nsiamo proprio sicuri che non hai barato ;-) ?"; }
esempio di output:
voto compito in classe n. 1? 6.5
voto compito in classe n. 2? 7.5
voto compito in classe n. 3? 7
media: 7
continua cosi' :-)
In questo esempio il numero di compiti in classe sui quali effettuare la media, non è una costante matematica (come ), tuttavia è comunque meglio utilizzare una variabile costante, perché il numero
sostituito nelle occorrenze di
N_COMPITI_IN_CLASSE
sarebbe un numero magico: come potrebbe un utilizzatore del codice comprendere il suo significato?
// ex4_2_4.cpp #include <iostream.h> void main() { // costante gravitazionale (sistema MKS) const double G = 6.67e-11; double m1, m2, distanza; cout << "massa 1 ? "; cin >> m1; cout << "massa 2 ? "; cin >> m2; cout << "distanza? "; cin >> distanza; double F = G * (m1 * m2) / (distanza * distanza); cout << "F = " << F; }
esempio di output 4.7:
massa 1 ? 5.98e24
massa 2 ? 7.34e22
distanza? 3.84e8
F = 1.98546e+20
Abbiamo utilizzato nel precedente esempio la formula della gravitazione universale di Newton:
F
, cioè una lettera maiuscola, per una variabile; F
, la forza gravitazionale, è solitamente utilizzata in carattere maiuscolo, per cui è bene fare una eccezione alla regola convenzionale precedentemente enunciata a proposito degli identificatori delle variabili; una eccezione del genere riguarda la costante di Nepero, la quale viene per chiarezza solitamente identificata con una e
minuscola.