56 votes

Les variables booléennes ne sont-elles pas toujours fausses par défaut ?

J'avais déclaré une variable booléenne bool abc; dans une classe et pensait qu'elle serait fausse par défaut. Un site si dans mon programme, if (abc) J'ai donc sorti la valeur de abc, et j'ai vu qu'elle contenait la valeur 55. Est-ce normal ?

Doit-on toujours assigner 'bool abc=false' pour être sûr que c'est faux ?

0 votes

0 votes

2 votes

Un bogue "intéressant" qui peut apparaître dans cette situation est que b et !b valent tous les deux true.

49voto

Nylon Smile Points 2364

Parler de les types de données primitifs intégrés (bool, char, wchar_t, short, int, long, float, double, long double), selon la norme C++, seules les variables globales ont une valeur par défaut de zéro s'ils ne sont pas explicitement initialisés.

Pour les variables locales, il n'est pas nécessaire que le compilateur nettoie le contenu de la mémoire à laquelle elles sont assignées. Une variable locale -- si elle n'est pas explicitement initialisée -- contiendra une valeur arbitraire.

7 votes

Techniquement, il s'agit de variables de static storage duration Les globaux font partie de ce type de variable.

0 votes

Le C++ initialisera les types intégrés à zéro lorsqu'ils sont initialisés avec un constructeur par défaut. Par exemple, dans maps. std::map<int,bool> m; std::cout << (m[0] ? "true": "false"); imprimera toujours false .

45voto

Crazy Eddie Points 23778

Oui, vous devez toujours initialiser vos variables. Jusqu'à ce que vous appreniez intimement les moments où il est et n'est pas nécessaire de le faire explicitement, vous devriez le faire tout le temps, quoi qu'il arrive. Et d'ici là... eh bien... pourquoi arrêter une bonne habitude ?

Pour initialiser un bool à false, il suffit de le construire par défaut :

struct X
{
  bool b;
  X() : b() {}
};

16 votes

J'aime ajouter le littéral booléen explicite false (pour moi cela le rend plus lisible (bien que techniquement pas différent du vôtre)).

0 votes

La liste init est-elle nécessaire ? Je pensais que l'expression 'bool b;' invoquait le ctor par défaut... J'ai toujours été confus sur la façon dont les listes init et les variables membres interagissent.

8voto

Regan Koopmans Points 326

Seules les variables globales sont affectées à 0 (faux) par défaut. Toutes les variables locales se voient attribuer une valeur résiduelle non nulle, qui serait évaluée à true dans une variable booléenne.

4voto

Mehrdad Points 70493

Oui. Toujours initialiser vos variables avant utilisation. Même si le langage garantit qu'elles auront des valeurs spécifiques. Si vous ne pouvez pas vous forcer, obtenez un compilateur qui se plaindra, puis obligez-vous à le faire. :)

Cependant, Ne le fais pas. initialiser des valeurs à moins que cela n'ait vraiment un sens pour elles d'être initialisées. Par exemple, si vous avez une boucle comme celle-ci (je ne dis pas que c'est un bon code, c'est juste un exemple) :

int i = 0;
while ((i = getNum()) == 5)
{
}

Ne pas initialiser i à zéro comme je l'ai fait. Cela n'a pas de sens, et bien que cela arrête le compilateur, cela introduit la possibilité que vous l'oubliiez et que votre code soit abîmé. Si vous pouvez vous forcer à n'initialiser qu'aux bons moments -- ni plus, ni moins -- alors vous rendrez le débogage beaucoup plus facile, puisque votre fichier un code erroné regardez faux même à un simple coup d'oeil .

Donc, en une ligne : Ne jamais initialiser juste pour éviter que le compilateur ne se plaigne, mais toujours initialiser avant l'utilisation.

3voto

KitsuneYMG Points 7604

Oui. Vous devez soit faire bool x=false o bool x(false) . Les primitives qui ne sont pas initialisées peuvent avoir cualquier valeur.

Voir Wikipedia

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X