2017-01-26 17 views
1

есть выражение (как часть срединного расчета):, что преобразование применяется в выражении (двойной Int)

auto iter1 = std::next(first, floor(size/2) - 1); 
double result = *iter1 + *(iter1 + 1))/2; 

, где типа значения при итераторах является Int.

ожидаемый результат, например:

1,5 = (1 + 2)/2

однако, в случае значений 1 и 2 результат равен 1, выглядит как неявное преобразование в Int

пожалуйста, объясните, что такое правило применяется здесь

+0

Что такое 'iter1'? Кроме того, '/ 2.f'. –

+0

Возможный дубликат [Целочисленное деление всегда ноль] (http://stackoverflow.com/questions/9455271/integer-division-always-zero) – JETM

+0

Результат '(1 + 2)' уже имеет тип 'int', no требуется неявное преобразование. –

ответ

4

В вашем втором выражении double result = *iter1 + *(iter1 + 1))/2; (или мое недопонимание?): в соответствии с оператором приоритет, сначала выполняется оценка *(iter1 + 1))/2; и поскольку операнды оператора / оба являются ints, подвыражение приведет к integer division. Затем результат целочисленного деления добавляется к *iter1.

есть выражение (как часть срединного расчета):

double result = *iter1 + *(iter1 + 1))/2; 

Поскольку общий тип выражения в правой стороне представляет собой int. Нет conversion делается. По крайней мере один double устранит вашу проблему. (Также обратите внимание на скобки, которые я добавил в соответствии с вашим примером).

double result = (*iter1 + static_cast<double>(*(iter1 + 1)))/2.0; 
+0

Вы скопировали несогласованные парады из вопроса ... –

+0

Вместо этого я бы выбрал один из разыменованных итераторов, чтобы вы также избежали возможных проблем с переполнением суммы. –

+0

@MatteoItalia, Yeap. Хорошая забота. Исправлена. – WhiZTiM