Добавление `bool` в` float`

Я поддерживаю некоторый код и наткнулся на этот фрагмент:

int num = 0;
float sum = 0.0;
bool value[rows][cols]; //initialized elsewhere in the code
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
if(value[i][j] == true) {
sum += value[i][j]; //shouldn't this be equivalent to "sum += 1;"//as it is in the if block?
num++;
}
float ans = 1.0;
if(num > 12)
ans = sum / num;

Парень, который написал этот код изначально, делает что-то чертовски умное здесь, или должен ans всегда быть 1? Насколько я могу сказать, num а также sum должно быть всегда одно и то же значение, нет?

2

Решение

Это будет так же, как sum += 1 с true значение будет преобразовано в 1 это покрыто в проект стандарта C ++ раздел 4.9 Плавающие-интегральные преобразования который говорит:

Если тип источника — bool, значение
Значение false преобразуется в ноль, а значение true преобразуется в единицу.

Аддитивные операторы будут вызывать обычные арифметические преобразования быть исполненным на их операндах. Который в этом случае будет охватываться этим делом:

В противном случае, если один из операндов является float, другой должен быть преобразован в float.

и мы знаем, что E1 += E2 эквивалентно E1 = E1 + E2 из раздела 5.17 Операторы присваивания и составного присваивания который говорит:

Поведение выражения вида E1 op = E2 эквивалентно E1 = E1 op E2, за исключением того, что E1
оценивается только один раз. […]

5

Другие решения

Ответ не fiendlishly умный, потому что if Заявление все еще присутствует.

Чтобы быть умным, можно сделать что-то вроде этого:

for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
sum += value[i][j];  // Add 1 if true, 0 if false.
num += value[i][j];  // Add 1 (increment) if true, add 0 if false
}
}

Предполагается, что bool Тип преобразуется в 1, если trueи 0, если false, Вот как все было сделано на заре компьютеров.

Если true оценивает к некоторому ненулевому значению кроме 1, этот код не будет работать правильно.

После дальнейшего анализа sum а также num будет иметь то же значение в конце цикла.
Итак, используйте только num и преобразовать в float в конце цикла.

3

Если значение является (двумерным) массивом boolто это эквивалентно sum += 1, В отличие от того, что думают некоторые, сравнение с == true является не так же, как неявное преобразование в bool (например, в контексте условия оператора if). Любое целое число не равно 1 будет считаться отличным от true,

1
По вопросам рекламы ammmcru@yandex.ru