我的GUI中有一个显示图表的小部件。如果我有多个图表,则会在GUI上的矩形中显示图例。
我有QStringlist (legendText)
,其中包含图例的文字。如果不需要图例,legendText
将为空。如果有一个图例,legendText
会保留文字。
为了找到图例周围矩形的高度,我想执行以下操作:
int height = 10;
QStringList legendText;
...
height = height * (legendText->size() > 0);
...
将int
与boolean
相乘是一个好主意/好风格吗?我会遇到问题吗?
答案 0 :(得分:107)
如果有点不清楚,这在技术上很好。
bool
将提升到int
,因此结果定义明确。但是,查看该代码我不会立即获得您想要实现的语义。
我会写一些类似的东西:
height = legendText->isEmpty() ? 0 : height;
这使你的意图更加清晰。
答案 1 :(得分:32)
根据标准(§4.5/ 6)完全没问题:
bool
类型的prvalue可以转换为int
类型的prvalue,false
变为零,true
成为一个。
但是,我建议使用isEmpty
而不是将size
与零height = height * (!legendText->isEmpty());
进行比较
或者使用条件运算符作为其他答案建议(但仍然使用isEmpty
代替.size() > 0
)
答案 2 :(得分:16)
您可以使用条件(三元)运算符:
List<Long> top = Arrays.asList(5645L, 2312L, 7845L, 1212L);
List<Employee> employees = Arrays.asList(
new Employee(1212, "A"),
new Employee(2312, "V"),
new Employee(5645, "D"),
new Employee(7845, "T")
);
Comparator<Employee> indexOf = (o1, o2) -> top.indexOf(o1.id) - top.indexOf(o2.id);
Collections.sort(employees, indexOf);
答案 3 :(得分:11)
也许这个?
if(legendText->isEmpty())
{
height = 0;
}
或
int height = legendText->isEmpty() ? 0 : 10;
答案 4 :(得分:0)
有些人可能会发现以下信息很有用(在高性能程序中应考虑以下代码,其中每个时钟周期都很重要,这里的目的是展示替代技术,我不会在这种特殊情况下使用它。)
如果你需要没有分支的快速代码,你可以使用按位运算符实现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
进行异或来实现。
因此,在您的情况下,我们得到以下表达式:
height = (-(legendText->isEmpty()^1) & height);