39
è una costante letterale perché il suo significato è univocamente determinato a priori: si tratta di un numero intero positivo, e che può quindi essere assegnato come valore ad una variabile di tipo int 4.2. Alla stessa maniera, tutte le volte che, negli esempi precedenti, abbiamo assegnato ad una variabile un valore, abbiamo utilizzato delle costanti letterali.
Per quanto riguarda i numeri interi, cioè i numeri il cui valore può essere assegnato a variabili di tipo int, le costanti letterali si riducono ai numeri naturali, che tutti conosciamo. Il discorso è invece diverso per i numeri reali: una costante letterale che può essere assegnata ad una variabile di tipo double deve utilizzare una delle seguenti equivalenti sintassi:
100.0
: deve essere presente il punto come separatore per le cifre decimali, anche se la parte decimale è nulla;1.0e2
: è possibile alternativamente usare la notazione scientifica4.3 ,la quale è comoda per numeri molto grandi, o molto piccoli;Per i caratteri, abbiano già detto che bisogna inserire il carattere stesso, o la sequenza di escape, tra due apici (' ').
// ex4_1_1.cpp #include <iostream.h> void main() { int a = 7; double x = .123e3; double y = .000000001; char c = 'A'; cout << a << '\t' << x << '\t' << y << '\t' << c; }
output:
7 | 123 | 1e-09 | A |
Come è evidente, in fase di stampa per i numeri reali, è il programma a scegliere la notazione da utilizzare. Riproponiamo ora un quesito che abbiamo lasciato in sospeso qualche pagina fa: cosa succede se assegnamo ad una variabile di un certo tipo una costante letterale di un altro? Ci sono due possibilità: il compilatore ritiene tale operazione lecita oppure illecita. Nel secondo caso si blocca e segnala un errore, la qual cosa era da aspettarsi. Può succedere però in determinati casi che il compilatore accetti l'operazione: in questo caso esso effettua una conversione implicita, cioè riesce, in base a ben precise regole, a fare in modo che la costante letterale, prima di essere assegnata alla variabile, venga convertita nello stesso tipo di essa. Le regole di conversione implicita del C++ non sono oggetto del nostro interesse, per cui non le elencheremo per esteso; si sappia comunque che: un double può essere convertito in un int, perdendo la parte decimale, un char può essere considerato per quasi ogni operazione un int, e un int può senza problemi essere promosso a double. Vediamo il seguente esempio:
// ex4_1_2.cpp #include <iostream.h> void main() { int a1 = 7; double x1 = 2.71; char c1 = 'Q'; int a2 = x1; // double -> int int a3 = c1; // char -> int double x2 = a1; // int -> double double x3 = c1; // char -> double char c2 = a1; // int -> char // warning char c3 = x1; // double -> char // warning cout << a1 << 't' << x1 << 't' << c1 << '\n'; cout << a2 << 't' << x2 << 't' << c2 << '\n'; cout << a3 << 't' << x3 << 't' << c3 << '\n'; }
output:
7 | 2.71 | Q | |
2 | 7 | ||
81 | 81 |
Come si vede, il compilatore ci torna due messaggi warning4.4 riguardo i pericolosi assegnamenti da double e int a char, dal significato misterioso: quale senso può avere assegnare ad un carattere un numero?. Si sappia, ma non è importante ai fini di questo corso, che la conversione da char a int avviene tramite la codifica ASCII4.5, secondo la quale alle cifre '0-9' corrispondono gli interi '48-57', ai caratteri maiuscoli 'A-Z' gli interi '65-90' e ai caratteri minuscoli 'a-z' gli interi '97-112'. Il seguente esempio permette di stampare su schermo la tabella del codice ASCII nell'intervallo '32-126' (si tralasciano gli interi fuori da questo intervallo perché dipendenti dalla piattaforma utilizzata):
// ex4_1_3.cpp #include <iostream.h> void main() { for (int i = 32; i < 127; i++) { char c = i; cout << c << '\t'; if ((i % 10) == 2) cout << '\n'; } }