Quando dovresti usare bool in C ++?

34

Abbiamo avuto un incarico per la nostra classe in cui abbiamo dovuto creare un Tic-tac-toe gioco. Alla gente piace complicarsi, così hanno scritto giochi complessi che includevano menu. Alla fine del gioco, dovevi avere la possibilità di giocare di nuovo o di uscire dal programma. Ho usato una variabile int per quello, ma ho notato alcuni compagni di classe che usano BOOL.

È più efficiente? Qual è la differenza, tra la memorizzazione di una risposta che dovrebbe memorizzare solo due valori in un int invece di memorizzarlo in un bool? Qual è lo scopo esatto di queste variabili?

    
posta Bugster 20.04.2012 - 12:25
fonte

6 risposte

82

Quando scegli i tipi di variabile e i nomi delle variabili, vuoi che il tuo intento sia il più chiaro possibile. Se scegli un tipo bool (booleano), è chiaro che esistono solo due valori accettabili: true o false . Se si utilizza un tipo int (numero intero), non è più chiaro che l'intento di tale variabile può essere solo 1 o 0 o qualsiasi valore scelto per indicare true e false . Inoltre sizeof(int) tornerà in genere come 4 byte, mentre sizeof(bool) restituirà 1.

    
risposta data 20.04.2012 - 12:39
fonte
53

Sembra che in tutte le risposte raccolte (fino ad ora) nessuno abbia colto il fatto che l'OP parlava di BOOL non bool .

Poiché la domanda è codificata in C ++, si deve notare che:

  • int è un numero intero che varia da INT_MIN a INT_MAX - macro definite in <climits> i cui valori dipendono dall'architettura della macchina host. In C ++ questi valori sono accessibili anche come std::numeric_limits<int>::min() e ...:max() rispettivamente). Il comportamento degli operatori booleani applicato a int tratta 0 come falso e tutto il resto come vero .
  • BOOL è solo un suggerimento che suggerisce un comportamento booleano per un int. È definito in <cstddef> come

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
    
  • BOOL non è nient'altro che zucchero sintattico, per quello che -dal compilatore- non è nient'altro che un int. È un programmatore C che usa, ma i programmatori C ++ dovrebbero evitare, poiché C ++ ha bool .

  • bool è un tipo integrale di linguaggio i cui valori supportati sono solo true e false . Quando convertito in int true diventa 1 e false diventa 0.

L'aspetto importante è che è più sicuro contro gli errori di programmazione:

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

è impossibile codificarlo con il tipo di bool corretto:

bool a = false;
a = 5; // error: no bool(const int&) available.

Usare BOOL invece di bool è solo una cattiva abitudine ereditata da un glorioso passato che nessuno ancora è in grado di dimenticare, creando così vecchi problemi per un domani meno glorioso.

Gli insegnanti di lingue dovrebbero pensarci seriamente!

    
risposta data 20.04.2012 - 14:06
fonte
6

I tipi di Bool sono più piccoli dei tipi di Int, quindi usano meno spazio nella memoria. A seconda del sistema su cui si sta compilando / per, un Int può essere di 4 - 8 byte, mentre un Bool è di 1 byte (come si può vedere in questo articolo MSDN )

Accoppia questo con alcuni aspetti di KISS e un buon programma di progettazione, e diventa chiaro perché è meglio usare un bool per memorizzare una variabile che avrà sempre solo 2 valori.

Perché complicare le cose con un oggetto in grado di memorizzare un ampio intervallo di valori, quando sei sicuro di aver solo bisogno di memorizzare 1 o 2 valori diversi?

Cosa succede nel sistema che usa un int, se ne memorizzi 75? Se hai aggiunto condizionali extra

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

o

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

allora sei coperto per questa situazione. Ma se non lo fai, allora non lo sei.

Potresti anche avere un caso (a seconda di come stai modificando il valore di int) in cui hai un sovraccarico del buffer, e il valore "resetta" torna a 0 o il limite inferiore del tuo int (che potrebbe essere da qualche parte nella regione da -127 a -9,223,372,036,854,775,808, a seconda dell'architettura di destinazione ) cosa succede nel tuo codice allora?

Tuttavia, se hai usato un bool puoi usare qualcosa di simile:

if(continueBool == true)
  return true;
else
  return false;

O anche:

return (continueBool== true) ? true : false;

o anche:

return continueBool;

A seconda del compilatore, potrebbero esserci ottimizzazioni che possono essere eseguite sul codice che utilizza Bool per memorizzare valori true / false mappati. Considerando che potrebbero non esserci ottimizzazioni che possono essere eseguite per Ints utilizzati per memorizzare valori true / false mappati.

Dobbiamo anche ricordare che C ++ (insieme a C, Assembly e FORTRAN) è usato per scrivere codice altamente efficiente, piccolo e veloce. Quindi, sarebbe meglio usare un Bool in questa istanza, specialmente se ti stai marcando sull'uso di variabili, memoria, cache o tempo del processore.

Una domanda simile potrebbe essere: perché dovrei memorizzare un intero (valore) in un float? Risposta: non dovresti, perché non ha senso.

Per farla breve: come insegnante / tutor / docente / docente di andare oltre le dimensioni di diversi tipi di valore con te (nel caso ti sia sfuggito) e perché sono importanti nello sviluppo di software.

Spero che questo aiuti come punto di partenza (spero anche che non si presenti come pedante)

    
risposta data 20.04.2012 - 12:56
fonte
1

Lo scopo qui è chiarezza d'intenti. Il tipo restituito fa parte di un'interfaccia funzioni e un bool ti dice di più su cosa aspettarsi dalla funzione rispetto a un int .

Anche BOOL è più espressivo di int , anche se è dello stesso tipo mostra almeno il tuo intento.

Tuttavia, nessuno di loro è quello che consiglierei:

enum class UiCmd {QUIT, START_GAME};
    
risposta data 29.03.2018 - 09:26
fonte
-1

Nella programmazione vuoi rappresentare qualcosa della vita reale nel codice. Nonostante un int e bool possano fare lo stesso, l'idea subyacent è completamente diversa: quando si usa un bool la risposta potrebbe essere sì o no; e questo è tutto, questo è l'intento. Con numeri interi potresti rappresentare quantità senza punto decimale. E in quello stesso spirito, perché dovresti scegliere un numero intero quando un doppio può fare lo stesso? Se un numero intero ha più senso di un doppio quando si modella il problema, allora si può scegliere un int.

    
risposta data 28.03.2018 - 06:50
fonte
-2

Perché alla fine, convertirai il tuo intero in un booleano comunque: "if (i = 1) poi giocherai un altro gioco". In questa situazione (i = 1) viene convertito in vero o falso: un booleano.

    
risposta data 20.04.2012 - 12:51
fonte

Leggi altre domande sui tag