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 .

6voto

EvilTeach Points 12235

Oui, c'est sûr.

0 est interprété comme faux, tout le reste est vrai,
donc !5 est un faux
!0 est considéré comme vrai
donc !!5 est vrai

3voto

tabdamage Points 230

Je recommande de ne jamais supprimer cet avertissement, et de ne jamais utiliser un c cast (bool) pour le supprimer. Les conversions ne sont pas toujours appelées comme vous le supposez.

Il y a une différence entre une expression qui évalue à vrai et un booléen de cette valeur.

Il faut s'habituer à ! ! et au ternaire, mais ils font le même travail, si vous ne voulez pas définir des types internes avec des casts surchargés vers bool.

L'approche de Dima est également bonne, puisqu'elle attribue la valeur d'une expression à un bool.

2voto

warren Points 12172

Si l'avertissement vous inquiète, vous pouvez également forcer le casting : bool b = (bool)t;

2voto

Jim In Texas Points 775

Je déteste vraiment !!t !!!!!!. C'est ce qu'il y a de pire dans le C et le C++, la tentation d'être trop intelligent à moitié avec sa syntaxe.

bool b(t != 0) ; // C'est la meilleure solution, car elle montre explicitement ce qui se passe.

1voto

Kristopher Johnson Points 34554

! !! est peut-être compact, mais je pense qu'il est inutilement compliqué. Mieux vaut désactiver l'avertissement ou utiliser l'opérateur ternaire, à mon avis.

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