Явное / неявное преобразование типов C++

У меня есть строка кода

double i = 1 + (long)1.5* 5.0f

Мой вопрос: каков порядок конвертации и результат? Поиск таких примеров, но безрезультатно. Есть ли хорошие гиды, которые могут помочь мне понять это?

4 ответа

Решение

Мой вопрос: каков порядок конвертации и результат?

В ролях применяется к 1.5, давая long со значением 1,

Это преобразовано в float для умножения с 5.0f, давая float со значением 5.0f,

1 преобразуется в float для сложения с этим значением, давая float со значением 6.0f,

Наконец, это повышен до double (сохраняя значение 6.0) назначить i,

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

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

double i = 1 + (long)(1.5* 5.0f);  // = 8.0

или используйте приведение в стиле C++, которое вызывает использование скобок:

double i = 1 + static_cast<long>(1.5* 5.0f)

Есть ли хорошие гиды, которые могут помочь мне понять это?

Вот один из них: http://en.cppreference.com/w/cpp/language/operator_precedence. Обратите внимание, что приведение типа имеет более высокий приоритет, чем умножение, что, в свою очередь, выше, чем сложение (3 против 5 против 6).

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

Если вы не уверены, каков приоритет оператора приведения, перепишите выражение (в вашей голове)

(long)1.5 * 5.0

в

5.0 * (long)1.5

Здесь довольно очевидно, что имеет приоритет и то же самое с первой версией

Эта таблица приоритетов должна рассказать вам все, что вам нужно знать.

  1. Кастинг: 1.5 приведен к long
  2. Умножение: 1.5 * 5.0f, который бросает этот продукт как float
  3. Дополнение: 1 + ( ((long) 1.5) * 5.0f)
  4. Назначение: i = 1 + ((long) 1.5 * 5.0f)
Другие вопросы по тегам