2013-10-01 3 views
4

У меня есть строка кодаявное/неявное преобразование типа C++

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

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

+7

Если вы не уверены, поместите скобки в свой код. ((long) (1.5 * 5.0f)) –

+0

Вы говорите о таблице приоритетов? –

+0

@MartinPerry - если вы не уверены, сделайте некоторое исследование. Слепое добавление круглых скобок обычно делает нечитаемый беспорядок. Или, в этом случае, используйте новый стиль: 'static_cast (1.5 * 5.0f)' кажется хорошим кандидатом. –

ответ

6

Вопрос: что такое порядок преобразования и результат?

Бросок применяется к 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. Обратите внимание, что тип cast имеет более высокий приоритет, чем умножение, что в свою очередь выше, чем добавление (3 против 5 против 6).

+0

* «1 способна плавать» *. Правильно ли здесь термин «продвинутый»? Я думаю, что он должен быть «преобразован». – Nawaz

+1

@ Наваз: Да, ты прав. Я точно не помню, что это такое. –

+0

@MikeSeymour Is действительно важно? (Для чего это необходимо: рекламные акции происходят, даже если оба операнда имеют один и тот же тип.Каждо другое - преобразование. Кроме того, я думаю, что единственный раз, когда происходит продвижение с плавающей запятой, является аргументом функции, совпадающим с '...'). –

0

This precedence table должен рассказать вам все, что вам нужно знать.

  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

Приведение к длинному означает, что умножение равно '1L * 5.0F'. – juanchopanza

1

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

0

Если вы не уверены в том, что приоритет оператора разливочной затем переписать выражение (в голове)

(long)1.5 * 5.0 

в

5.0 * (long)1.5 

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