Я поддерживаю некоторый код и наткнулся на этот фрагмент:
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
должно быть всегда одно и то же значение, нет?
Это будет так же, как 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
оценивается только один раз. […]
Ответ не 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
в конце цикла.
Если значение является (двумерным) массивом bool
то это эквивалентно sum += 1
, В отличие от того, что думают некоторые, сравнение с == true
является не так же, как неявное преобразование в bool
(например, в контексте условия оператора if). Любое целое число не равно 1
будет считаться отличным от true
,