Quando dovresti usare i bool in C ++?


34

Avevamo un incarico per la nostra classe in cui dovevamo creare un gioco Tic-tac-toe . Alla gente piace complicarsi, quindi hanno scritto giochi complessi che includevano menu. Alla fine del gioco, dovevi avere la possibilità di giocare di nuovo o uscire dal programma. Ho usato una intvariabile per questo, 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 intpiuttosto che la memorizzazione in un bool? Qual è lo scopo esatto di queste variabili?


32
Non sono sicuro dell'efficienza, ma lo scopo di an intè quello di memorizzare un numero intero e lo scopo di a boolè quello di memorizzare un valore booleano ( trueo false). L'uso di un boolIMO riflette il suo uso molto meglio dell'uso di un int.
George Duckett,

12
In effetti, prima di C ++ e C99, C89 non aveva un tipo booleano. I programmatori spesso typedef int Boolper chiarire che stavano usando un booleano. C ++ ha integrato il supporto boolnel linguaggio, così come C99 con la (piuttosto brutta) _Boolparola chiave.
Charles Salvia,

Non si tratta di "sapere quando usare bool", si tratta del perché abbiamo nomi diversi per tipi simili (come length_t) e perché è importante che il compilatore controlli i tipi.
Abyx,

A volte la risposta è solo "gusto". Scommetto che se riscrivi il tuo stesso compito in questo momento, ci saranno diverse cose come l'ordine dei parametri delle funzioni e i loro nomi. Perché non hai scritto lo stesso ordine di parametri o lo stesso nome? È perché non l'hai fatto o non era molto importante e hai appena scritto qualunque cosa

Risposte:


82

Quando si scelgono tipi di variabili e nomi di variabili, si desidera che il proprio intento sia il più chiaro possibile. Se si sceglie un tipo bool(booleano), è chiaro che ci sono solo due valori accettabili: trueo false. Se si utilizza un tipo int(intero), non è più chiaro che l'intento di quella variabile può essere solo 1 o 0 o qualsiasi valore si scelga di significare truee false. Plus sizeof(int)restituisce in genere 4 byte, mentre sizeof(bool)restituisce 1.


7
Concordato. Penso che le intenzioni di progettazione siano più importanti. Solo occasionalmente dovrai scavalcarli.
ChrisF

9
Per ribadire il punto di @ AndrewFinnel: Bool è più auto-documentante. Una variabile impostata su 0 o 1 potrebbe essere un contatore; una variabile impostata su vero o falso è chiaramente una bandiera.
Scott C Wilson,

2
I bool impediscono l'abuso di una variabile per altri usi. È possibile impostare un numero intero su valori diversi da 0 o 1 per creare stati aggiuntivi di cui il codice potrebbe non essere a conoscenza.
Michael Shopsin

+1. Rende chiaro l'intento / le opzioni. È possibile utilizzare qualsiasi metodo che ti piace per memorizzare il valore inclusa una stringa con il valore "yes" o "no", ma dovresti scegliere quello che ha più senso. In questo caso, è un valore booleano.
Craige,

Pensavo che i booleani in C ++ avessero le stesse dimensioni degli ints, 4 byte.
DogDog,

53

Sembra che in tutte le (fino ad ora) raccolte le risposte nessuno catturato il fatto che il PO ha parlato BOOLnon bool.

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

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

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOLnon è altro che zucchero sintattico, per ciò che, per il compilatore, non è altro che un int. È qualcosa che usa il programmatore C, ma i programmatori C ++ dovrebbero evitare, dato che C ++ ha bool.

  • boolè un tipo integrale di linguaggio i cui valori supportati sono just truee false. Quando convertito in int truediventa 1 e falsediventa 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 codificare con il tipo di bool corretto:

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

L'uso al BOOLposto di boolè solo una cattiva abitudine ereditata da un glorioso passato che nessuno è ancora in grado di dimenticare, creando così un vecchio problema per un domani meno glorioso.

Gli insegnanti di lingue dovrebbero pensarci seriamente!


9
BOOL non fa parte del linguaggio C ++ né del linguaggio C. BOOL con lettere maiuscole è il modo più comune in cui i booleani venivano implementati in C, ai vecchi tempi in cui C non aveva un tipo booleano. Ad esempio, l'API di Windows definirà BOOL. Inoltre, non si può dire come sia definito BOOL, alcune applicazioni potrebbero definirlo un campo bit lungo un bit. Non puoi presumere che sia sempre uguale a int solo perché una libreria specifica lo definisce in questo modo.

1
+1. Forse in realtà ha fatto media BOOL e non bool. Forse BOOL può essere implementato in modi potenzialmente diversi, anche se Codereview probabilmente non lo sa se sta facendo questo tipo di domanda. Vede che è definito come un int, quindi chiede naturalmente perché non può semplicemente usare int.
Neil,

1
@Lundin: in senso generale hai ragione, ma considera che questa è una risposta che lascia all'interno del campo della domanda, dove l'OP ha parlato di BOOL e int equivalenza.
Emilio Garavaglia,

Anche così, l'idea di usare BOOL o bool per indicare l'intento è ancora valida.
Andrew T Finnell,

1
@zvrba: vero, ma questo è dovuto al modo in cui MS ha deciso di implementare bool nei propri compilatori. È valido solo per compilatori MS che lavorano per processori Intel. Si noti che, per la piattaforma Intel, ogni tipo integrale inferiore a 32 bit richiede un mascheramento su input o output. Ma i char [] sono ancora usati e non necessariamente sostituiti da int []
Emilio Garavaglia

6

I tipi bool sono più piccoli dei tipi Int, quindi utilizzano meno spazio in memoria. A seconda del sistema su cui stai compilando / per, un Int può contenere da 4 a 8 byte, mentre un valore booleano è 1 byte (come si può vedere in questo articolo MSDN )

Abbinalo ad alcuni aspetti di KISS e alla buona progettazione del programma, e diventa ovvio il motivo per cui è meglio usare un bool per memorizzare una variabile che avrà sempre e solo 2 valori.

Perché complicare eccessivamente le cose con un oggetto in grado di memorizzare una vasta gamma di valori, quando si è sicuri di dover solo memorizzare 1 di 2 valori diversi?

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

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 l'hai fatto, allora non lo sei.

Potresti anche avere un caso (a seconda di come stai modificando il valore di int) in cui hai un buffer sovraccarico e il valore "ripristina" su 0 o sul limite inferiore del tuo int (che potrebbe trovarsi da qualche parte nel regione da -127 a -9.223.372.036.854.775.808, a seconda dell'architettura di destinazione ) cosa succede nel tuo codice?

Tuttavia, se hai usato un bool potresti usare qualcosa del genere:

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 delle ottimizzazioni che può eseguire sul codice che utilizza Bools per archiviare valori true / false mappati. Considerando che, potrebbero non esserci ottimizzazioni che può eseguire per Ints utilizzati per memorizzare valori true / false mappati.

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

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

Per farla breve: come tuo insegnante / tutor / docente / professore, vai con te sulle dimensioni dei diversi tipi di valore (nel caso in cui tu lo abbia perso) e perché siano importanti nello sviluppo del software.

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


4
Uso non necessario del premio if (). Scrivi solo return value >= 0;per il primo esempio.
zvrba,

Non ero sicuro a livello di comprensione della sintassi da parte di OP. A volte è gratificante essere un po 'più prolisso del normale - specialmente da quando OP ha affermato che si trattava di un compito
Jamie Taylor,

2
Non essere in disaccordo, ma solo per sottolineare che il salvataggio di tre byte scegliendo un bool su un int non farà alcuna differenza evidente per la maggior parte dei programmi. Non preoccuparti dell'efficienza fino a quando non hai davvero un problema di prestazioni!
James Anderson,

@James: anche in molti casi non salverai tre byte perché la variabile successiva, a meno che non sia un altro bool o un char, verrà probabilmente allineata a un limite di quattro byte.
JeremyP,

1

Lo scopo qui è la chiarezza di intenti. Il tipo restituito fa parte di un'interfaccia di funzioni e boolti dice di più su cosa aspettarsi dalla funzione di quanto intnon faccia.

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

Tuttavia, nessuno di loro è ciò che consiglierei:

enum class UiCmd {QUIT, START_GAME};

-1

Nella programmazione vuoi rappresentare qualcosa della vita reale nel codice. Nonostante int e bool possano fare lo stesso, l'idea subcentrata è completamente diversa: quando si usa un bool la risposta potrebbe essere sì o no; e questo è tutto, questo è l'intento. Con numeri interi è possibile rappresentare quantità senza virgola decimale. E con 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, è possibile scegliere un int.


1
questo non sembra offrire nulla di sostanziale rispetto ai punti formulati e spiegati nella risposta migliore qui che è stata pubblicata circa 6 anni fa
moscerino

-2

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


dipende molto dalla macchina su cui si sta eseguendo e dai compilatori coinvolti. Potresti essere sorpreso di apprendere che sui mainframe IBM un flag a singolo carattere con "Y" o "N" è il modo più efficiente per implementare la logica booleana.
James Anderson,

4
Da notare, if (i = 1)è probabilmente la cosa molto sbagliata da avere nel proprio codice.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.