我可以乘以一个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可以被转换为int
types的prvalue,其中false
为零,true
。
但是,我build议使用isEmpty
而不是比较size
零height = 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);
如果b
为true
则-b
为-1
,所有位均设为1
。 否则所有位都是0
。
布尔NOT( !b
)可以通过将b
与1
( b^1
)异或来实现。
所以在你的情况下,我们得到以下expression式
height = (-(legendText->isEmpty()^1) & height);