49 votes

Est-ce que ! ! est un moyen sûr de convertir en bool en C++ ?

[Cette question est liée à, mais pas la même que celui-ci .]

Si j'essaie d'utiliser des valeurs de certains types comme expressions booléennes, j'obtiens un avertissement. Plutôt que de supprimer cet avertissement, j'utilise parfois l'opérateur ternaire ( ?: ) pour convertir en bool. L'utilisation de deux opérateurs not ( !! ) semble faire la même chose.

Voilà 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?

Alors, la technique du double pas fait-elle vraiment la même chose ? Est-elle plus ou moins sûre que la technique ternaire ? Cette technique est-elle également sûre avec les types non intégraux (par exemple, avec les types void * ou double pour T ) ?

Je ne demande pas si !!t est un bon style. Je demande si c'est sémantiquement différent de t ? true : false .

0voto

J'utiliserais 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.

0voto

Jay Bazuzi Points 20462

Désactiver l'avertissement.

Rédigez d'abord pour la clarté, puis le profil, puis optimisez la vitesse, le cas échéant.

0voto

aib Points 18608

! ! n'est utile que lorsque vous utilisez une expression booléenne de manière arithmétique, par exemple :

c = 3 + !!extra; //3 or 4

(Lorsque tout ce dont vous avez besoin est une expression booléenne, le ! ! est redondant. Écrire

bool b = !!extra;

a autant de sens que :

if (!!extra) { ... }

-1voto

Marco M. Points 252

Je recommande d'utiliser

si (x != 0)

ou

si (x != NULL)

au lieu de if(x) ; c'est plus compréhensible et plus lisible.

-2voto

plinth Points 26817

Le double pas me semble bizarre et dans le code de débogage, il sera très différent du code optimisé.

Si vous êtes amoureux de ! ! vous pouvez toujours le Macro.

#define LONGTOBOOL(x) (!!(x))

(pour l'anecdote, l'opérateur ternaire est celui que je privilégie dans ces cas)

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