我可以乘以一个int在C + +的布尔值?

我在我的GUI中有一个小部件,显示图表。 如果我有多个图表,GUI上会显示一个矩形的图例。

我有一个包含图例文本的QStringlist (legendText) 。 如果没有图例需要, legendText将是空的。 如果将有一个图例, legendText将保存文本。

为了find图例周围矩形的高度,我想做以下操作:

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

这是一个好主意/良好的风格,以int乘以boolean ? 我会遇到问题吗?

这在技术上很好,如果有点不清楚。

bool被提升为 int ,所以结果是明确的。 然而,看着这个代码,我不会立即得到你想要实现的语义。

我会写一些像这样的东西:

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

这使你的意图更清晰。

根据标准(§4.5/ 6)完全没问题:

一个types为bool的prvalue可以被转换为inttypes的prvalue,其中false为零, true

但是,我build议使用isEmpty而不是比较sizeheight = height * (!legendText->isEmpty());

或者使用条件运算符作为其他答案的build议(但依然用isEmpty代替.size() > 0

您可以使用条件(三元)运算符:

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

也许这个?

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

要么

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

有些人可能会发现以下信息有用(下面的代码应该考虑在每个时钟周期都很重要的高性能程序中,这里的目的是展示替代技术,在这种情况下我不会使用它)。

如果你需要没有分支的快速代码,你可以通过使用按位运算符的布尔实现int乘法。

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

可以优化为:

 number = (-b & number); 

如果btrue-b-1 ,所有位均设为1 。 否则所有位都是0
布尔NOT( !b )可以通过将b1b^1 )异或来实现。
所以在你的情况下,我们得到以下expression式

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