prof. Nunzio Brugaletta
C++: programmazione e oggetti

EnneBi - Programmazione
Avanti - Indietro - Inizio

Il cast

A volte può interessare effettuare dei cambiamenti al volo per conservare i risultati di determinate operazioni in variabili di tipo diverso principalmente quando si va da un tipo meno capiente ad un tipo più capiente. In tali casi il linguaggio C++ mette a disposizione del programmatore un costrutto chiamato cast.

#include <iostream>
using namespace std;

int main()
{ 
  int uno, due;
  float tre;

  uno = 1;
  due = 2;
  tre = uno/due;
  cout << tre << endl;

  return 0;
}

Questo programma nonostante le aspettative (dettate dal fatto che la variabile tre è dichiarata float) produrrà un risultato nullo. Infatti la divisione viene effettuata su due valori di tipo int, il risultato viene conservato temporaneamente in una variabile di tipo int e, solo alla fine, conservato in una variabile float. È evidente, a questo punto, che la variabile tre conterrà solo la parte intera (cioè 0).

Affinché la divisione produca il risultato atteso, è necessario avvisare C++ di convertire il risultato intermedio prima della conservazione definitiva nella variabile di destinazione.

Tutto ciò è possibile utilizzando il costrutto cast. Utilizzando questo costrutto, il programma, si scriverebbe così:

#include <iostream>
using namespace std;

int main()
{ 
  int uno, due;
  float tre;

  uno = 1;
  due = 2;
  tre = static_cast<float> (uno)/due;
  cout << tre << endl;

  return 0;
}

In questo caso il programma fornisce il risultato atteso. Infatti il quoziente viene calcolato come float (il contenuto della variabile uno viene forzato float) e quindi, dopo, assegnato alla variabile tre.

In definitiva il costrutto cast forza una espressione a essere di un tipo specifico (nell'esempio una divisione intera viene forzata a fornire un risultato di tipo virgola mobile).

Viene adesso proposta una interessante applicazione del casting per la trasformazione di un carattere minuscolo nella sua rappresentazione maiuscola. Il programma sfrutta, per ottenere il suo risultato, il fatto che una variabile di tipo char, in definitiva, conserva un codice numerico; qui viene inoltre usato il casting per mostrare tale codice.

#include <iostream>
using namespace std;

int main()
{
  char min,mai;
  const int scarto=32;	/*1*/

  cout << "Conversione minuscolo-maiuscolo" << endl;
  cout << "Introduci un carattere minuscolo ";
  cin  >> min;	/*2*/

  if (min>=97 && min<=122) {	/*3*/
    mai = min-scarto;	/*4*/
    cout << "\n Rappresentazione maiuscola " << mai << endl;	/*5*/
    cout << "Codice ASCII " << static_cast<int>(mai) << endl;	/*6*/
  }
  else 
    cout << "\n Carattere non convertibile" << endl;

  return 0;
}

Nella riga con etichetta 1 è definita la costante scarto. Il valore 32 dipende dal fatto che, nel codice ASCII, tale è la distanza fra le maiuscole e le minuscole (es. ‘A’ ha codice 65, ‘a’ ha codice 97).

Nella riga con etichetta 2 si effettua l’input del carattere da elaborare.

Nella riga con etichetta 3 si controlla, utilizzando la sua rappresentazione numerica, se il carattere immesso rientra nei limiti della codifica ASCII delle lettere minuscole. Le lettere minuscole, in ASCII, hanno codice compreso fra 97 (la lettera minuscola a) e 122 (la lettera minuscola z). Il confronto poteva anche essere fatto sulla rappresentazione alfanumerica:

if (min>=’a’ && min<=’z’)

Nella riga con etichetta 4 si effettua in pratica la trasformazione in maiuscolo. Al codice numerico associato al carattere viene sottratto il valore 32. In questo caso è utilizzato il codice numerico del carattere. Si noti che in questo contesto ha senso assegnare ad un char il risultato di una sottrazione (operazione numerica).

Nella riga con etichetta 5 si effettua l’output di mai inteso come carattere (così è infatti definita la variabile), laddove nella riga 6 si effettua l’output del suo codice numerico (è usato un casting sulla variabile).



Avanti - Indietro - Inizio

http://ennebi.solira.org
ennebi@solira.org