50 votes

Puis-je multiplier un int avec un boolean en C++ ?

J'ai un widget dans mon interface graphique qui affiche un ou plusieurs graphiques. Si j'ai plus d'un graphique, une légende sera affichée dans un rectangle sur l'interface graphique.

J'ai un QStringlist (legendText) qui contient le texte de la légende. Si aucune légende n'est requise, legendText serait vide. S'il y aura une légende, legendText tiendrait le texte.

Pour trouver la hauteur du rectangle autour de la légende, je voudrais faire ce qui suit :

 int height = 10;
 QStringList legendText;
 ...
 height = height * (legendText->size() > 0);
 ...

Est-ce une bonne idée/un bon style de multiplier une int avec un boolean ? Est-ce que je vais rencontrer des problèmes avec cela ?

107voto

TartanLlama Points 1461

C'est techniquement bien, mais un peu flou.

El bool sera promu à un int Le résultat est donc bien défini. Cependant, en regardant ce code, je ne comprends pas immédiatement la sémantique que vous essayez d'obtenir.

J'écrirais simplement quelque chose comme :

height = legendText->isEmpty() ? 0 : height;

Cela rend votre intention beaucoup plus claire.

32voto

SingerOfTheFall Points 9936

C'est parfaitement bien selon la norme (§4.5/6) :

Une valeur de type bool peut être converti en une prvalue de type int avec false devenant zéro et true en devenir un.

Cependant, je suggère d'utiliser isEmpty au lieu de comparer size à zéro height = height * (!legendText->isEmpty());

Ou utiliser l'opérateur conditionnel comme le suggèrent les autres réponses (mais toujours avec isEmpty au lieu de .size() > 0 )

16voto

Surt Points 2540

Vous pouvez utiliser l'opérateur conditionnel (ternaire) :

height = ( legendText->size() >0 ) ? height : 0 ;

11voto

AyCe Points 329

Peut-être ça ?

if(legendText->isEmpty())
{
   height = 0;
}

ou

int height = legendText->isEmpty() ? 0 : 10;

1voto

Maciej Points 1501

Certaines personnes peuvent trouver les informations suivantes utiles (le code suivant doit être considéré dans des programmes de haute performance où chaque cycle d'horloge compte et son but ici est de montrer des techniques alternatives, je ne l'utiliserais pas dans cette situation particulière).

Si vous avez besoin d'un code rapide sans branches, vous pouvez implémenter la multiplication d'un int avec un boolean en utilisant des opérateurs bitwise.

bool b = true;
int  number = 10;
number = b*number;

peut être optimisé pour :

number = (-b & number);

Si b es true puis -b es -1 et tous les bits sont mis à 1 . Sinon, tous les bits sont 0 .
Booléen NOT ( !b ) peut être implémenté par XOR'ing b con 1 ( b^1 ).
Ainsi, dans votre cas, nous obtenons l'expression suivante :

height = (-(legendText->isEmpty()^1) & height);

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