[英]Can I multiply an int with a boolean in C++?
我的GUI中有一个显示图表的小部件。 如果我有多个图表,GUI上的矩形会显示一个图例。
我有一个QStringlist (legendText)
,它包含图例的文本。 如果不需要图例, legendText
将为空。 如果有一个图例, legendText
会保存文本。
为了找到图例周围的矩形高度,我想执行以下操作:
int height = 10;
QStringList legendText;
...
height = height * (legendText->size() > 0);
...
将int
与boolean
相乘是一个好主意/好的风格吗? 我会遇到问题吗?
如果有点不清楚,这在技术上很好。
bool
将被提升为 int
,因此结果是明确定义的。 但是,查看该代码我不会立即获得您想要实现的语义。
我只想写下这样的东西:
height = legendText->isEmpty() ? 0 : height;
这使您的意图更加清晰。
根据标准(§4.5/ 6),它完全没问题:
bool
类型的prvalue可以转换为int
类型的prvalue,false
变为零,true
变为1。
但是,我建议使用isEmpty
而不是将size
与zero height = height * (!legendText->isEmpty());
或者使用条件运算符作为其他答案建议(但仍使用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
)可以通过XOR'ing b
以1
( b^1
)来实现。
所以在你的情况下我们得到以下表达式:
height = (-(legendText->isEmpty()^1) & height);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.