web-dev-qa-db-fra.com

Quand faut-il utiliser des bools en C ++?

Nous avions une tâche pour notre classe où nous devions créer un jeu Tic-tac-toe. Les gens aiment se compliquer, alors ils ont écrit des jeux complexes qui comprenaient des menus. À la fin du jeu, vous deviez avoir la possibilité de rejouer ou de quitter le programme. J'ai utilisé une variable int pour cela, mais j'ai remarqué que certains camarades de classe utilisaient des booléens.

Est-ce plus efficace? Quelle est la différence entre stocker une réponse qui ne devrait stocker que deux valeurs dans un int plutôt que de la stocker dans un booléen? Quel est le but exact de ces variables?

34
Bugster

Lorsque vous choisissez des types de variables et des noms de variables, vous souhaitez que votre intention soit aussi claire que possible. Si vous choisissez un type bool (booléen), il est clair qu'il n'y a que deux valeurs acceptables: true ou false. Si vous utilisez un type int (entier), il n'est plus clair que l'intention de cette variable ne peut être que 1 ou 0 ou quelque valeur que vous choisissiez pour signifier true et false. De plus, sizeof(int) renverra généralement 4 octets, tandis que sizeof(bool) renverra 1.

82
Andrew T Finnell

Il semble que dans toutes les réponses (jusqu'à présent) collectées, personne n'ait compris que l'OP parlait de BOOL pas bool.

Puisque la question est étiquetée C++, il faut noter que:

  • int est un entier compris entre INT_MIN et INT_MAX - macros définies dans <climits> dont les valeurs dépendent de l'architecture de la machine d'hébergement. En C++, ces valeurs sont également accessibles en tant que std::numeric_limits<int>::min() et ...:max() respectivement). Le comportement des opérateurs booléens appliqué à int traite 0 Comme false et tout le reste comme true.
  • BOOL n'est qu'un indice suggérant un comportement booléen pour un int. Il est défini dans <cstddef> Comme

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
    
  • BOOL n'est donc rien de plus que du sucre syntaxique, pour quoi -par le compilateur- ce n'est rien de plus qu'un int. C'est quelque chose que les programmeurs C utilisent, mais les programmeurs C++ devraient éviter, car C++ a bool.

  • bool est un type intégral de langage dont les valeurs prises en charge sont simplement true et false. Une fois converti en inttrue devient 1 et false devient 0.

L'aspect important est qu'il est plus sûr contre les erreurs de programmation:

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

est impossible à coder avec le bon type de bool:

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

Utiliser BOOL au lieu de bool n'est qu'une mauvaise habitude héritée d'un passé glorieux que personne n'est encore capable d'oublier, créant ainsi un vieux problème pour un avenir moins glorieux.

Les professeurs de langues devraient y penser sérieusement!

53
Emilio Garavaglia

Les types de booléens sont plus petits que les types Int, donc utilisent moins de place en mémoire. Selon le système sur lequel vous compilez/pour, un Int peut être de 4 à 8 octets, tandis qu'un Bool est de 1 octet (comme on peut le voir dans cet article MSDN )

Ajoutez à cela certains des aspects de KISS et une bonne conception de programme, et il devient évident pourquoi il vaut mieux utiliser un booléen pour stocker une variable qui ne sera jamais avoir 2 valeurs.

Pourquoi trop compliquer les choses avec un objet qui peut stocker une large gamme de valeurs, alors que vous êtes sûr de n'avoir besoin que de stocker 1 sur 2 valeurs différentes?

Que se passe-t-il dans le système qui utilise un int, si vous en stockez 75? Si vous avez ajouté des conditions supplémentaires

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

ou

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

alors vous êtes couvert pour cette situation. Mais si vous ne l'avez pas fait, vous ne l'êtes pas.

Vous pouvez également avoir un cas (selon la façon dont vous modifiez la valeur de l'int) où vous avez un dépassement de mémoire tampon, et la valeur "réinitialise" à 0 ou la limite inférieure de votre int (qui pourrait être quelque part dans le région de -127 à −9,223,372,036,854,775,808, selon votre architecture cible ) que se passe-t-il alors dans votre code?

Cependant, si vous avez utilisé un bool, vous pouvez utiliser quelque chose comme ceci:

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

Ou même:

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

ou même:

return continueBool;

Selon votre compilateur, il peut y avoir des optimisations qu'il peut effectuer sur du code qui utilise des booléens pour stocker des valeurs vraies/fausses mappées. Cependant, il peut ne pas y avoir d'optimisations pour les Ints utilisées pour stocker les valeurs vraies/fausses mappées.

Nous devons également nous rappeler que C++ (avec C, Assembly et FORTRAN) est utilisé pour écrire du code très efficace, petit et rapide. Donc, il serait préférable d'utiliser un booléen dans ce cas - surtout si vous êtes marqué sur votre utilisation des variables, de la mémoire, du cache ou du temps processeur.

Une question similaire serait: pourquoi devrais-je stocker un entier (valeur) dans un flotteur? Réponse: Vous ne devriez pas, car cela ne sert à rien.

En bref: en tant que professeur/tuteur/conférencier/professeur, passez en revue avec vous les tailles de différents types de valeur (au cas où vous l'auriez manqué), et pourquoi elles sont importantes dans le développement de logiciels.

J'espère que ça aide comme point de départ (j'espère aussi que ça ne se présente pas comme pédant)

7
Jamie Taylor

Le but ici est la clarté de l'intention. Le type de retour fait partie d'une interface de fonctions et un bool vous en dit plus sur ce qu'il faut attendre de la fonction qu'un int.

Même BOOL est plus expressif que int, même s'il s'agit du même type, il montre au moins votre intention.

Cependant, aucun d'entre eux n'est ce que je recommanderais:

enum class UiCmd {QUIT, START_GAME};
1
kamikaze