Dal C al C++/Utilizzo basilare di librerie/Il tipo "bool": differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
G4Bot (discussione | contributi)
m Bot: Aggiungo: "{{Avanzamento|50%}} "
Nessun oggetto della modifica
Riga 1:
{{Dal C al C++}}
 
Il C++ introduce le tre parole-chiave "<code>bool</code>", "<code>true</code>", e "<code>false</code>", usate nel seguente programma:
== Il tipo "bool" ==
 
<source lang=cpp>
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;
Riga 20:
if (a) cout << " OK";
cout << " " << a << b << c << d << e << f;
}
</source>
Questo programma stampa sulla console: " OK OK OK OK 101111".
 
Questo programma stampa sulla console: "<code> OK OK OK OK 101111</code>".
"bool" è un nuovo tipo fondamentale.
 
"<code>bool"</code> è un nuovo tipo fondamentale.
Il suo nome è l'abbreviazione di "boolean", cioè "booleano" ossia "valore di verità logico".
 
Line 30 ⟶ 32:
 
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;
 
<source lang=c>
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.
#define TRUE 1
Ovviamente, lo spazio effettivamente occupato in memoria da una variabile di tipo "bool" non potrà essere in generale solo di un bit, in quanto nessun processore è in grado di indirizzare il singolo bit.
#define FALSE 0
In molte implementazioni, un "bool" occupa un byte, in altre due o più byte.
typedef int BOOL;
</source>
 
In C++ tutto ciò non è più necessario, in quanto il tipo "<code>bool"</code> ha proprio lo scopo di rappresentare le variabili che possono contenere solo un bit.
Le parole-chiave "true" e "false" rappresentano delle costanti predefinite di tipo "bool".
Ovviamente, lo spazio effettivamente occupato in memoria da unaun variabileoggetto di tipo "<code>bool"</code> non potrà essere in generale solo di un bit, in quanto nessun processore è in grado di indirizzare il singolo bit.
Ovviamente, "true" significa "vero" o "1", e "false" significa "falso" o "0".
In molte implementazioni, un "<code>bool"</code> occupa un solo byte, in altre due o più byte.
 
Le parole-chiave "<code>true"</code> e "<code>false"</code> rappresentano delle costanti predefinite di tipo "<code>bool"</code>.
Nell'esempio sopra, le variabili booleane "a" e "b" sono dichiarate e inizializzate, rispettivamente, a "true" e a "false".
Ovviamente, "<code>true"</code> significa "vero" o "1", e "false" significa "falso" o "0".
 
Nell'esempio sopra, le variabili booleane "<code>a"</code> e "<code>b"</code> sono dichiarate e inizializzate, rispettivamente, a "<code>true"</code> e a "<code>false"</code>.
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.
Poi viene dichiarata la variabile "<code>c"</code>, di tipo "<code>int"</code>, ma inizializzata con una variabile di tipo "<code>bool"</code>.
È un po' come assegnare un carattere a un intero.
Tale inizializzazione, così come un analogo assegnamento, è del tutto ammissibile, in quanto il tipo "<code>bool"</code> 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 computazionalmente è a costo zero, in quanto la rappresentazione interna non cambia.
 
Poi vengono dichiarate le variabili "<code>d"</code>, "<code>e"</code>, ed "<code>f"</code>, di tipo "<code>bool"</code>, 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 <code>false"</code>, la cui rappresentazione interna è proprio zero.
Se l'espressione ha qualsiasi altro valore, viene assegnato "<code>true"</code>, la cui rappresentazione interna è uno.
 
Se l'espressione non è una costante valutabile dal compilatore, come nel caso delle variabili "<code>d"</code> ed "<code>e"</code>, la conversione è a costo zero, altrimentise èinvece richiestoil uncompilatore non riesce a determinare se pizzicol'espressione di inizializzazione vale zero oppure no, allora verrà generato del codice per verificare seassegnare il valore èuno zeroquando oppurol'espressione nonon vale zero.
A causa di ciò alcuni compilatori segnalano un avvertimento per l'inizializzazione di "f".
AncheA l'inizializzazionecausa "d"di è anomala, in quanto si assegna un valore che non è tra quelli ammissibili, per cuiciò alcuni compilatori segnalano un avvertimento ancheprestazionale inper l'inizializzazione questodi caso<code>f</code>.
 
Anche l'inizializzazione di <code>d</code> è 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;
<source lang=cpp>
bool e = 1 != 0;
bool fd = c4 != 0;
bool de = 41 != 0;
Il risultato di un'espressione relazionale è sempre di tipo "bool", e qualunque espressione è vera proprio se diversa da zero.
bool ef = 1c != 0;
</source>
 
Consideriamo adesso le espressioni relazionali, cioè quelle formate con gli operatori di confronto <code>==</code>, <code>!=</code>, <code><</code>, <code><=</code>, <code>></code>, <code>>=</code>.
Il risultato di tali espressioni è sempre di tipo <code>bool</code>.
 
Nell'esempio ci sono poi degli utilizzi delle variabili booleane dichiarate.
Sono tutte corrette e appropriate, tranne quella che contiene l'espressione "<code>a == true"</code>.
Infatti è del tutto pleonastico chiedersi se un'espressione è uguale a "<code>true"</code>.
L'espressione è equivalente e altrettanto chiara della semplice espressione "<code>a"</code>.
 
Infine vengono stampate tutte le variabili dichiarate.
La variabile "<code>b"</code>, che vale "<code>false" </code>, viene stampata come "<code>0"</code>; la variabile intera "<code>c"</code> che ha ricevuto il valore "<code>true"</code>, e tutte le altre, che valgono "<code>true"</code>, sono stampate come "<code>1"</code>.
 
[[Categoria:Dal C al C++|Tipi fondamentali]]