Dal C al C++/Utilizzo basilare di librerie/Il tipo "bool"

Il tipo boolModifica

Il C++ introduce le tre parole-chiave "bool", "true", e "false", usate nel seguente programma:

#include <iostream>
using namespace std;
int main() {
    bool a = true;
    bool b = false;
    int c = a;
    bool d = 4;
    bool e = 1;
    bool f = c;
    if (a || b) cout << " OK";
    if (a && b) cout << " Impossibile";
    if (a == b) cout << " Impossibile";
    if (a != b) cout << " OK";
    if (a == true) cout << " OK";
    if (a) cout << " OK";
    cout << " " << a << b << c << d << e << f;
}

Questo programma stampa sulla console: " OK OK OK OK 101111".

bool è un nuovo tipo fondamentale. Il suo nome è l'abbreviazione di "boolean", cioè "booleano" ossia "valore di verità logico".

In linguaggio C, per rappresentare i valori di verità binari, si usano svariati tipi, interi, caratteri, o puntatori. La regola è che i valori diversi da zero rappresentano la verità, mentre il valore zero rappresenta la falsità.

In moltissimi programmi, essendoci l'esigenza di evidenziare che una variabile è usata esclusivamente per memorizzare un valore booleano, si premettono definizioni analoghe alle seguenti:

#define TRUE 1
#define FALSE 0
typedef int BOOL;

In C++ tutto ciò non è più necessario, in quanto il tipo bool ha proprio lo scopo di rappresentare le variabili che possono contenere solo un bit. Ovviamente, lo spazio effettivamente occupato in memoria da un oggetto di tipo bool non potrà essere in generale solo di un bit, in quanto nessun processore è in grado di indirizzare il singolo bit. In molte implementazioni, un bool occupa un solo byte, in altre due o più byte.

Le parole-chiave true e false rappresentano delle costanti predefinite di tipo bool. Ovviamente, true significa "vero" o "1", e "false" significa "falso" o "0".

Nell'esempio sopra, le variabili booleane a e b sono dichiarate e inizializzate, rispettivamente, a true e a false.

Poi viene dichiarata la variabile c, di tipo int, ma inizializzata con una variabile di tipo bool. Tale inizializzazione, così come un analogo assegnamento, è del tutto ammissibile, in quanto il tipo bool viene convertito implicitamente in un intero. Tale operazione è analoga a quella in cui si assegna un carattere a un intero. Nella conversione, ovviamente, il valore "false" diventa "0", e il valore "true" diventa "1". Questa conversione è a costo zero, in quanto la rappresentazione interna non cambia.

Poi vengono dichiarate le variabili d, e, ed f, di tipo bool, ma inizializzate con espressioni di tipo intero. Tali inizializzazioni sono lecite, e hanno il seguente effetto. Se l'espressione vale zero, viene assegnato il valore false, la cui rappresentazione interna è proprio zero. Se l'espressione ha qualsiasi altro valore, viene assegnato true, la cui rappresentazione interna è uno.

Se l'espressione è una costante valutabile dal compilatore, come nel caso delle variabili d ed e, la conversione è a costo zero, se invece il compilatore non riesce a determinare se l'espressione di inizializzazione vale zero oppure no, allora verrà generato del codice per assegnare il valore uno quando l'espressione non vale zero. A causa di ciò alcuni compilatori segnalano un avvertimento prestazionale per l'inizializzazione di f.

Anche l'inizializzazione di d è anomala, in quanto viene assegnato un valore che non è tra quelli ammissibili, per cui alcuni compilatori segnalano un avvertimento prestazionale anche in questo caso. Per evitare tali avvertimenti, si può sostituire tali righe con le seguenti:

bool d = 4 != 0;
bool e = 1 != 0;
bool f = c != 0;

Consideriamo adesso le espressioni relazionali, cioè quelle formate con gli operatori di confronto ==, !=, <, <=, >, >=. Il risultato di tali espressioni è sempre di tipo bool.

Nell'esempio ci sono poi degli utilizzi delle variabili booleane dichiarate. Sono tutte corrette e appropriate, tranne quella che contiene l'espressione a == true. Infatti è del tutto pleonastico chiedersi se un'espressione è uguale a true. L'espressione è equivalente e altrettanto chiara della semplice espressione a.

Infine vengono stampate tutte le variabili dichiarate. La variabile b, che vale false, viene stampata come 0; la variabile intera c che ha ricevuto il valore true, e tutte le altre, che valgono true, sono stampate come 1.

Il tipo wchar_tModifica

Un altro tipo di dato introdotto è wchar_t. Il tipo wide char è utilizzato per contenere caratteri non latini ma la lunghezza della variabile non è stata fissata negli standard e dipende quindi dall'implementazione: non bisogna quindi dare per scontato che un carattere Unicode possa essere contenuta in una variabile di questo tipo.

esempio

wchar_t stringa_di_wide_char[256] = L"Ciao! こんにちは";