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

Dal C al C++
Copertina Tutti i moduli · Sviluppo
* IntroduzioneDal C al C++/Introduzione
** I destinatari del libroDal C al C++/Introduzione#I destinatari del libro
** La struttura del libroDal C al C++/Introduzione#La struttura del libro
** Impieghi del linguaggioDal C al C++/Introduzione#Impieghi del linguaggio
** PanoramicaDal C al C++/Introduzione#Panoramica
* Utilizzo basilare di librerie
** ArrayDal C al C++/Array
** Il tipo "bool"Dal C al C++/Utilizzo basilare di librerie/Il tipo "bool"
** L'uso di classi e oggettiDal C al C++/Utilizzo basilare di librerie/L'uso di classi e oggetti
** Dichiarazioni e definizioniDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni
*** Le variabili riferimentoDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#Le variabili riferimento
*** Il modificatore "const"Dal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#Il modificatore "const"
*** Il sovraccaricamentoDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#Il sovraccaricamento
*** L'inizializzazione degli oggettiDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#L'inizializzazione degli oggetti
*** L'allocazione degli oggettiDal C al C++/Utilizzo basilare di librerie/Dichiarazioni e definizioni#L'allocazione degli oggetti
** L'uso dei templateDal C al C++/Utilizzo basilare di librerie/L'uso dei template
** L'uso dei namespaceDal C al C++/Utilizzo basilare di librerie/L'uso dei namespace
** I file di intestazioneDal C al C++/Utilizzo basilare di librerie/I file di intestazione
** L'uso delle stringheDal C al C++/Utilizzo basilare di librerie/L'uso delle stringhe
** I canali di ingresso/uscitaDal C al C++/Utilizzo basilare di librerie/I canali di ingresso/uscita
** La gestione delle eccezioni
** I contenitori standardDal C al C++/Utilizzo basilare di librerie/I contenitori standard
** Le funzioni standardDal C al C++/Utilizzo basilare di librerie/Le funzioni standard
* Utilizzo avanzato di librerie
** Ridefinizione di funzioni membroDal C al C++/Utilizzo avanzato di librerie/Ridefinizione di funzioni membro
** I parametri di defaultDal C al C++/Utilizzo avanzato di librerie/I parametri di default
** Gli iteratori sui contenitori
** Gli algoritmi sui contenitori
* Creazione di librerie
** Classi isolateDal C al C++/Classi isolate
*** I costruttoriDal C al C++/Classi isolate#I costruttori
*** I distruttoriDal C al C++/Classi isolate#I distruttori
*** Separazione tra interfaccia e implementazioneDal C al C++/Classi isolate#Separazione tra interfaccia e implementazione
** Gerarchie di classiDal C al C++/Gerarchie di classi
** Proprietari di risorse
** Eccezioni
** Namespace
** Template di funzione
** Template di classe
** Algoritmi su sequenze
* La metaprogrammazione
* La progettazione del software
* Gioco life di ConwayDal C al C++/Gioco life di Conway
Modifica il sommario

# Il tipo bool

Il C++ introduce le tre parole-chiave "bool", "true", e "false", usate nel seguente programma:
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:
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:
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_t

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