явное / неявное преобразование типов Переполнение стека

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

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).

6

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

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

1

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

  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)
0

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

(long)1.5 * 5.0

в

5.0 * (long)1.5

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

0
По вопросам рекламы [email protected]