exponenta event banner

MISRA C++: Правило 2008 5-0-7

Не должно быть явных плавающих-интегральных преобразований выражения значения

Описание

Определение правила

Не должно быть явных плавающих-интегральных преобразований выражения cvalue.

Объяснение

Выражения, отмеченные этой проверкой, соответствуют подробным спецификациям выражений значений из документации MISRA ® C++ .

Если вычислить выражение и позже привести результат к другому типу, приведение не повлияет на базовый тип вычисления (самый широкий из типов данных операнда в выражении). Например, в этом примере результат целочисленного деления затем преобразуется в тип с плавающей запятой.

short num;
short den;
float res;
res= static_cast<float> (num/den);
Однако разработчик или рецензент кода может ожидать, что оценка использует тип данных, к которому результат приводится позже. Например, можно ожидать деления с плавающей запятой из-за более позднего приведения.

Дополнительное сообщение в отчете

Не должно быть явных плавающих-интегральных преобразований выражения cvalue.

Комплексное выражение базового типа typeBeforeConversion может быть приведен только к более узкому целочисленному типу той же сигнатуры, однако тип назначения typeAfterconversion.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

void func() {
     short num;
     short den;
     short res_short;
     float res_float;
     
     res_float = static_cast<float> (num/den); //Noncompliant
     
     res_short = num/den;
     res_float = static_cast<float> (res_short); //Compliant

}

В этом примере первый отлив на результате деления нарушает правило, а второй отлив - нет.

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

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

Проверить информацию

Группа: Выражения
Категория: Обязательно
Представлен в R2013b