Могу ли я умножить int на boolean в С++?
У меня есть виджет в моем графическом интерфейсе, который отображает диаграммы. Если у меня больше одной диаграммы, в графике будет отображаться легенда, изображенная в прямоугольнике.
У меня есть QStringlist (legendText)
, который содержит текст легенды. Если нет никакой легенды, legendText
будет пустым. Если будет легенда, legendText
будет содержать текст.
Чтобы найти высоту прямоугольника вокруг легенды, я хотел бы сделать следующее:
int height = 10;
QStringList legendText;
...
height = height * (legendText->size() > 0);
...
Это хорошая идея/хороший стиль, чтобы умножить int
на boolean
? Будут ли у меня проблемы с этим?
Ответы
Ответ 1
Это технически хорошо, если немного неясно.
bool
будет продвигаться до int
, поэтому результат будет определен. Однако, глядя на этот код, я не сразу получаю семантику, которую вы пытаетесь достичь.
Я бы просто написал что-то вроде:
height = legendText->isEmpty() ? 0 : height;
Это делает ваше намерение более ясным.
Ответ 2
Это отлично в соответствии со стандартом (§4.5/6):
Значение типа bool
может быть преобразовано в prvalue типа int
, с false
становится равным нулю, а true
становится единым.
Однако я предлагаю использовать isEmpty
вместо сравнения size
с нолем height = height * (!legendText->isEmpty());
Или используйте условный оператор, как указывают другие ответы (но все же с isEmpty
вместо .size() > 0
)
Ответ 3
Вы можете использовать условный (тройной) оператор:
height = ( legendText->size() >0 ) ? height : 0 ;
Ответ 4
Может быть, это?
if(legendText->isEmpty())
{
height = 0;
}
или
int height = legendText->isEmpty() ? 0 : 10;
Ответ 5
Некоторые люди могут найти следующую полезную информацию (следующий код следует учитывать в программах с высокой производительностью, где каждый цикл синхронизации имеет значение, и целью здесь является показать альтернативные методы, я бы не использовал его в этой конкретной ситуации).
Если вам нужен быстрый код без ветвей, вы можете реализовать умножение int с помощью boolean с помощью побитовых операторов.
bool b = true;
int number = 10;
number = b*number;
можно оптимизировать для:
number = (-b & number);
Если b
- true
, то -b
- -1
, и все биты установлены на 1
. В противном случае все биты 0
.
Boolean NOT (!b
) может быть реализовано с помощью XOR'ing b
с помощью 1
(b^1
).
Поэтому в вашем случае мы получаем следующее выражение:
height = (-(legendText->isEmpty()^1) & height);