next up previous contents index
Next: Funzioni matematiche Up: Funzioni Previous: Ancora sulle funzioni   Indice   Indice analitico

Conversioni esplicite

Nei primi paragrafi di questo capitolo abbiamo parlato di conversioni implicite, effettuate in maniera del tutto automatica dal compilatore, ove possibile. Esiste un modo in C++ di controllare tali conversioni, dette esplicite perché messe in atto dal programmatore. Il significato profondo delle conversioni esplicite diverrà chiaro solo molto più in là nello studio del linguaggio; ci si accontenti in questa sede di familiarizzare con le loro sintassi. Esistono in C++ due tipi di conversioni esplicite, che indicheremo con i nomi di stile-C e stile-C++. Le conversioni esplicitice stile-C, dette cast, hanno la seguente sintassi:
(tipo_in_uscita)variabile
mentre per le conversioni esplicite stile-C++ abbiamo:
tipo_in_uscita(variabile)
Le due sintassi risultano molto simili tra loro formalmente, tuttavia presentano profonde differenze concettuali, che esamineremo in altra sede. Per ora è possibile utilizzare indifferentemente l'una o l'altra sintassi. Comunque, si tenga in considerazione che i casi nei quali una conversione esplicita è necessaria sono davvero pochi; quindi prima di adoperare con scioltezza tale costrutto, si faccia un esame di coscienza chiedendosi se per caso non si poteva procedere in maniera da evitare la conversione. Ecco alcuni esempi:


// ex4_6_1.cpp
#include <iostream.h>

double cubo (double x) {
  return x * x * x;
}

void main () {
  double x;
  cout << "x = "; cin >> x;
  int n = (int)x;
  int m = (int)cubo(x);
  cout << "n = " << n << "\n";
  cout << "m = " << m << "\n";
}

esempio di output:
x = 2.5
n = 2
m = 15

Si noti che le conversioni esplicite possono essere applicate, oltre che a variabili, anche direttamente al ritorno di una funzione, come nell'esempio precendente.


// ex4_6_2
// stampa numeri pseudocasuali compresi tra 0 e 1
#include <iostream.h>
#include <time.h>    // time(0)
#include <stdlib.h>  // rand() e srand

bool primaVolta = true;

double pseudocasuale() {
  // RAND_MAX e' il massimo numero casuale generabile
  // double x = rand() / RAND_MAX; // x = 0 sempre
  double x = double(rand()) / double(RAND_MAX);
  return x;
}

void main () {
  srand();
  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++)
      cout << pseudocasuale() << "\t";
    cout << "\n";
  }
}

esempio di output:
 0.538431 0.134463 0.535882 0.787069 0.51592
 0.402621 0.162227 0.447079 0.933299 0.800465
 0.380121 0.724816 0.240518 0.257309 0.368562
 0.0406549 0.0897557 0.109004 0.810874 0.107771
 0.961749 0.517911 0.758584 0.115805 0.776136

In questo caso la conversione esplicita è fondamentale nello statement:


double x = double(rand()) / double(RAND_MAX);
perché in caso contrario (si consiglia di provare per credere) il programma effettua per prima cosa la divisione fra due interi, la quale ha quoziente sempre nullo perchè rand() è sempre più piccolo di RAND_MAX, e poi converte implicitamente il risultato in double. Dobbiamo invece far sì che la divisione operata sia tra numeri reali, sfruttando le conversioni esplicite (nota: un cast avrebbe funzionato ugualmente).

ex-2
si scriva un programma che accetti un numero intero, un carattere e un numero reale; dopo avere effettuato le opportune conversioni, si stampi la loro somma, la quale deve essere un numero intero;
ex-3
si scriva un programma che accetti un numero intero e restituisca il suo inverso (come numero reale); si gestisca il caso in cui l'utente inserisce il numero $0$;


next up previous contents index
Next: Funzioni matematiche Up: Funzioni Previous: Ancora sulle funzioni   Indice   Indice analitico
Claudio Cicconetti
2000-09-06