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, une légende apparaîtra dans un rectangle sur l’interface graphique.

J’ai un QSsortingnglist (legendText) qui contient le texte de la légende. S’il n’y a pas de légende requirejse, legendText serait vide. S’il y a une légende, legendText contiendra le texte.

Pour trouver la hauteur du rectangle autour de la légende, procédez comme suit:

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

Est-ce une bonne idée / un bon style pour multiplier un int avec un boolean ? Est-ce que je vais avoir des problèmes avec ça?

C’est techniquement bien, même si c’est un peu flou.

Le bool sera promu 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.

Je voudrais simplement écrire quelque chose comme:

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

Cela rend votre intention beaucoup plus claire.

C’est parfaitement correct selon la norme (§4.5 / 6):

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

Cependant, je suggère d’utiliser isEmpty au lieu de comparer la size à la height = height * (!legendText->isEmpty()); 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 )

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

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

Peut être ça?

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

ou

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

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

Si vous avez besoin d’un code rapide sans twigs, vous pouvez implémenter la multiplication int avec booléen à l’aide d’opérateurs binarys.

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

peut être optimisé pour:

 number = (-b & number); 

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

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