Подтвердить что ты не робот

Могу ли я умножить int на boolean в С++?

У меня есть виджет в моем графическом интерфейсе, который отображает диаграммы. Если у меня больше одной диаграммы, в графике будет отображаться легенда, изображенная в прямоугольнике.

У меня есть QStringlist (legendText), который содержит текст легенды. Если нет никакой легенды, legendText будет пустым. Если будет легенда, legendText будет содержать текст.

Чтобы найти высоту прямоугольника вокруг легенды, я хотел бы сделать следующее:

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

Это хорошая идея/хороший стиль, чтобы умножить int на boolean? Будут ли у меня проблемы с этим?

4b9b3361

Ответ 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);