Est !! un moyen sûr de se convertir à bool en C++?
[Cette question est liée mais n'est pas le même que cette une.]
Si j'essaie d'utiliser des valeurs de certains types d'expressions booléennes, je reçois un avertissement. Plutôt que de supprimer l'avertissement, j'ai parfois l'utilisation de l'opérateur ternaire (?:
) pour convertir un bool. À l'aide de deux pas des opérateurs (!!
) semble faire la même chose.
Voici ce que je veux dire:
typedef long T; //similar warning with void * or double
T t = 0;
bool b = t; //performance warning: forcing 'long' value to 'bool'
b = t ? true : false; //ok
b = !!t; //any different?
Donc, ne le double pas de technique vraiment faire la même chose? Est-il plus ou moins sûr que le ternaire technique? Est cette technique également sans danger avec les types intégraux (par exemple, avec void *
ou double
pour T
)?
Je ne suis pas demander si !!t
est un bon style. Je me demande si il est sémantiquement différent de t ? true : false
.
- Quand je vois une ligne comme "b = t ? true : false;" je suis toujours tenté de la remplacer par la ligne "b = t". Il y a déjà un cast implicite de bool, pourquoi mâche de la sémantique?
- comme le Q dit, parce que b=t donne un avertissement
- intéressant de voir comment beaucoup de gens sont contre
!!
sur la base subjective. double négation est la idiomatiques cast-à-bool véhicule en JavaScript, et si javascripters l'obtenir, je m'attends à C++ utilisateurs de trop. - double négation est commun dans la plupart des langages de script stackoverflow.com/questions/524658/what-does-mean-in-ruby Donc, l'utilisation dans un cadre de haut niveau, compréhensible code(au moins par l'écrivain lui-même) est strictement interdite.. 🙂
- Un, ce serait le cas lors de l'affectation d'une valeur à un champ de drapeau dans une struct. Votre solution doit tronquer (au moins dans certains compilateurs), tandis que le reste est proposé ici serait le drapeau à la valeur de vérité. En supposant que le compilateur va faire la bonne chose (pour vous) n'est pas la chose la plus intelligente. Et le réglage de la bit-champ de type booléen ne change pas (au moins avec le compilateur, je m'occupe). Comportement indéfini.
Vous devez vous connecter pour publier un commentaire.
L'argument de la ! l'opérateur et le premier argument de l'opérateur ternaire sont à la fois implicitement converti en booléen, donc !! et ?: sont OMI idiot redondant décorations de la fonte. Je vote pour
Pas de conversions implicites.
Sinon, vous pouvez faire ceci:
bool b = (t != 0)
Attention!
Ceux-ci sont très concepts distincts:
Lors de l'intégration de ces concepts, il faut le faire explicitement. J'aime le Dima version mieux:
b = (t != 0);
Que le code dit clairement: Comparer deux nombres et de stocker la valeur de vérité dans un booléen.
Toutes les techniques, tous va générer le même code.
Personnellement, je viens de désactiver l'avertissement afin que je puisse utiliser le plus propre syntaxe. Casting pour un bool n'est pas quelque chose que je suis inquiet à propos de faire accidentellement.
Oui c'est sûr.
0 est interprété comme faux, tout le reste est vrai,
donc !5 sort comme un faux
!0 en tant que vrai
si !!5 en tant que vrai
Je ne voudrais pas utiliser:
Qui est la moins lisible (et donc le plus difficile à maintenir)
Les autres dépendent de la situation.
Si vous êtes à la conversion à utiliser dans une expression booléenne seulement.
Puis je laisserais le langage de le faire pour vous:
Si vous êtes réellement stocker une valeur de type boolean. Alors tout d'abord je me demande pourquoi vous avez une longue dans le premier endroit qui exige le casting. Si vous avez besoin de le long et la valeur booléenne je considère toutes les suivantes, selon la situation.
Résumé:
Utiliser ce qui donne le plus de sens dans le contexte où vous vous trouvez.
Essayez de le rendre évident ce que vous faites
Je recommande de ne jamais supprimer cette alerte, et de ne jamais utiliser un c cast (bool) pour la supprimer. Les conversions peuvent ne pas toujours être appelé comme vous le supposez.
Il y a une différence entre une expression qui est évaluée à vrai, et un booléen de cette valeur.
Les deux !! et ternaires prendre pour s'y habituer, mais le travail se fera de la même façon, si vous ne voulez pas de définir interne avec des types de surcharge jette bool.
Dima approche est bien aussi, car il affecte la valeur d'une expression dans un bool.
Si vous êtes inquiet au sujet de l'avertissement, vous pouvez également forcer le casting:
bool b = (bool)t;
J'ai vraiment la haine !!t!!!!!!. C'est un bel exemple de la pire chose à propos de C et de C++, la tentation d'être trop malins avec votre syntaxe.
bool b(t != 0); //Est le meilleur moyen à mon humble avis, il montre explicitement ce qui se passe.
!! peut-être compact, mais je pense que c'est inutilement compliqué. Mieux pour désactiver l'avertissement ou de l'utilisation de l'opérateur ternaire, à mon avis.
Comparaison à 0 ne fonctionne pas si bien.
Ce qui revient -- pourquoi !! vs ternaire?
Je voudrais utiliser b = (0 != t) -- au moins, toute personne saine d'esprit peut le lire facilement. Si je voyais double dang dans le code, je serais assez surpris.
Désactiver l'avertissement.
Écrire pour plus de clarté, tout d'abord, puis de profil; puis d'optimiser pour la vitesse, si nécessaire.
!! n'est utile que lorsque vous êtes à l'aide d'une expression booléenne dans l'arithmétique de la mode, par exemple:
(Dont le style est un autre débat.) Lorsque tous vous avez besoin est une expression booléenne, l' !! est redondante. Écrit
sens autant que:
Je recommande d'utiliser
if (x != 0)
ou
if (x != NULL)
au lieu de if(x); c'est plus compréhensible et lisible.
if(x)
est plus lisible. Il ditif not zero
dans la plus concise.Le double ne se sent drôle pour moi et dans le code de débogage sera très différent de celui de code optimisé.
Si vous êtes en amour avec !! vous pouvez toujours Macro-il.
(en aparté, l'opérateur ternaire est ce que je préfère dans ces cas)
Je voudrais utiliser bool b = t et de laisser le compiler avertissement, en commentant cette ligne en particulier de la sécurité. La désactivation de l'alerte peut vous mordre dans le cul dans une autre partie du code.