我可以在C ++中将int与布尔值相乘吗?

时间:2015-10-15 07:14:49

标签: c++ int boolean

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

我有QStringlist (legendText),其中包含图例的文字。如果不需要图例,legendText将为空。如果有一个图例,legendText会保留文字。

为了找到图例周围矩形的高度,我想执行以下操作:

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

intboolean相乘是一个好主意/好风格吗?我会遇到问题吗?

5 个答案:

答案 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);

如果btrue,则-b-1,所有位均设为1。否则所有位都是0 布尔NOT(!b)可以通过b1)与b^1进行异或来实现。
因此,在您的情况下,我们得到以下表达式:

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