web-dev-qa-db-fra.com

Puis-je multiplier un int avec un booléen en C ++?

J'ai un widget dans mon interface graphique qui affiche des graphiques. Si j'ai plus d'un graphique, il y aura une légende affichée dans un rectangle sur l'interface graphique.

J'ai une 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 contiendrait 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 pour multiplier un int par un boolean? Vais-je rencontrer des problèmes avec ça?

50
user3443063

C'est techniquement correct, bien qu'un peu flou.

bool sera prom en int, donc le résultat est bien défini. Cependant, en regardant ce code, je n'obtiens pas instantanément la sémantique que vous essayez d'atteindre.

J'écrirais simplement quelque chose comme:

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

Cela rend votre intention beaucoup plus claire.

107
TartanLlama

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

Une valeur de type bool peut être convertie en une valeur de type int, false devenant zéro et true devenant un.

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

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

32
SingerOfTheFall

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

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

Peut être ça?

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

ou

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

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

Si vous avez besoin d'un code rapide sans branches, vous pouvez implémenter la multiplication int avec booléen à l'aide d'opérateurs au niveau du bit.

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

peut être optimisé pour:

number = (-b & number);

Si b est true alors -b est -1 et tous les bits sont définis sur 1. Sinon, tous les bits sont 0.
Boolean NOT (!b) peut être implémenté en XOR'ing b avec 1 (b^1).
Donc, dans votre cas, nous obtenons l'expression suivante:

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