next up previous contents index
Next: Variabili costanti Up: Funzioni Previous: Funzioni   Indice   Indice analitico

Costanti letterali

Le costanti letterali (literal) in C++ sono tutti gli identificatori 4.1 che hanno un significato intrinseco. Ad esempio il numero 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:

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';
  }
}


next up previous contents index
Next: Variabili costanti Up: Funzioni Previous: Funzioni   Indice   Indice analitico
Claudio Cicconetti
2000-09-06