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 .

82voto

fizzer Points 8193

L'argument de l'opérateur ! et le premier argument de l'opérateur ternaire sont tous les deux implicitement convertis en bool, donc ! ! et ? : sont des décorations stupides et redondantes du cast. Je vote pour

b = (t != 0);

Pas de conversions implicites.

41voto

Dima Points 19888

Vous pouvez aussi faire ceci : bool b = (t != 0)

31voto

edgar.holleis Points 2760

Attention !

  • Un booléen concerne la vérité et la fausseté.
  • Un nombre entier concerne des nombres entiers.

Ce sont des concepts très distincts :

  • La vérité et la fausseté, c'est une question de décision.
  • Les nombres servent à compter des choses.

Lorsque l'on fait le lien entre ces concepts, il faut le faire de manière explicite. Je préfère la version de Dima :

b = (t != 0);

Ce code dit clairement : Comparer deux nombres et stocker la valeur de vérité dans un booléen.

6voto

Toutes les techniques sont valables, toutes génèrent le même code.

Personnellement, je désactive simplement l'avertissement afin de pouvoir utiliser la syntaxe la plus propre. Le transfert vers un bool n'est pas quelque chose que je crains de faire accidentellement.

6voto

Loki Astari Points 116129

Je ne l'utiliserais pas :

bool b = !!T;

C'est la façon la moins lisible (et donc la plus difficile à maintenir).

Les autres dépendent de la situation.
Si vous convertissez pour l'utiliser dans une expression bool uniquement.

bool b = t? true: false;
if (b)
{
    doSomething();
}

Alors je laisserais la langue le faire pour vous :

if (T)
{
    doSomething();
}

Si vous stockez réellement une valeur booléenne. Alors je me demanderais d'abord pourquoi vous avez un long en premier lieu qui nécessite le cast. En supposant que vous ayez besoin du long et de la valeur booléenne, j'envisagerais toutes les solutions suivantes en fonction de la situation.

bool  b = T?true:false;          // Short and too the point.
                                 // But not everybody groks this especially beginners.
bool  b = (T != 0);              // Gives the exact meaning of what you want to do.
bool  b = static_cast<bool>(T);  // Implies that T has no semantic meaning
                                 // except as a bool in this context.

Résumé : Utilisez ce qui a le plus de sens pour le contexte dans lequel vous vous trouvez.
Essayez de rendre évident ce que vous faites

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