77 votes

Pourquoi utiliser !! lors de la conversion de int bool?

Ce peut être une raison pour la conversion d'un nombre entier d'une valeur booléenne de cette façon?

bool booleanValue = !!integerValue;

au lieu de simplement

bool booleanValue = integerValue;

Tout ce que je sais, c'est que dans VC++7 ce dernier va provoquer C4800 avertissement et l'ancien ne sera pas. Est-il une autre différence entre les deux?

116voto

user143506 Points 935

Les problèmes avec les "!!" l'idiome qu'il est laconique, difficile à voir, facile à tort d'une faute de frappe, facile à déposer un de"! de "s", et ainsi de suite. Je l'ai mis dans les "regardez comme c'est mignon que nous pouvons être avec C/C++" de la catégorie.

Il suffit d'écrire bool isNonZero = (integerValue != 0); ... être clair.

50voto

T.J. Crowder Points 285826

Historiquement, l' !! de la métaphore a été utilisée pour s'assurer que votre bool contient l'une des deux valeurs attendues dans un bool-variable, parce que le C et le C++ n'ont pas de vrai bool type et nous truqué avec ints. C'est moins un problème maintenant, avec de "vrais" bools.

Mais à l'aide de !! est un moyen efficace de documentation (pour le compilateur et à tous les futurs personnes qui travaillent dans votre code) que oui, vous avez vraiment a l'intention de lancer cette int d'un bool.

16voto

SasQ Points 2332

Il est utilisé parce que le langage C (et quelques pré-standard compilateurs C++ trop) n'a pas eu l' bool , int. Si l' ints ont été utilisés pour représenter des valeurs logiques: 0 était censé signifier false, et tout le reste a été true. L' ! opérateur de retourner en 1 de 0 et 0 de tout le reste. Double - ! a été utilisé pour inverser les, et il était là pour s'assurer que la valeur est 0 ou 1 en fonction de sa valeur logique.

En C++, depuis l'adoption d'une bonne bool type, il n'y a pas besoin de faire cela. Mais vous ne pouvez pas simplement mettre à jour toutes les anciennes sources, et vous ne devriez pas avoir à, le, en raison de la compatibilité descendante de C à C++ (la plupart du temps). Mais beaucoup de gens le font encore, de la même raison: leur code en arrière-compatible avec les anciens compilateurs qui ne comprends toujours pas bools.

Et c'est la seule vraie réponse. D'autres réponses sont trompeuses.

14voto

StampedeXV Points 1221

Parce que !integerValue signifie integerValue == 0 et!integerValue signifie donc integerValue != 0, une expression valide de retourner un booléen. Ce dernier est une fonte avec perte d'information.

5voto

John Scipione Points 1176

Un booléen ne peut avoir que deux états, 0 et 1. Un entier peut avoir n'importe quel état de -2147483648 à 2147483647 en supposant un entier signé de 32 bits. Unaire ! opérateur de sorties 1 si l'entrée est 0 et sorties 0 si l'entrée est tout sauf 0. Afin de !0 = 1 et !234 = 0. Le deuxième ! passe simplement la sortie de sorte que 0 devient 1 et 1 devient 0.

Donc, la première déclaration des garanties que booleanValue sera égal à 0 ou 1 et aucune autre valeur, la deuxième déclaration n'est pas.

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