Тип компилятора Продвижение правосторонних выражений автоматически в операторе присваивания

Почему компилятор, не являющийся типом, переводит все вычисления выражений в правой части выражения присваивания по крайней мере на левый уровень типа?

например, "double x = (88.0 - 32) * 5 / 9" преобразуется в градусы Цельсия из Фаренгейта правильно, но... "double x = (88.0 - 32) * (5 / 9)" не будет.

Мой вопрос не в том, почему второй пример не возвращает желаемый результат. Мой вопрос заключается в том, почему компилятор типа не продвигает оценку (5/9) к оценке типа double.

1 ответ

Решение

Почему компилятор, не являющийся типом, переводит все вычисления выражений в правой части выражения присваивания по крайней мере на левый уровень типа?

Очень хороший вопрос На самом деле, давайте предположим, что компилятор сделает это автоматически. Теперь, принимая ваш пример:

double x = 88.0 - 32 * 5 / 9

Теперь часть RHS этого задания может быть полностью преобразована в double для всех токенов (лексем) несколькими способами. Я добавляю некоторые из них:

  1. 88,0 - 32 * (двойной) (5/9)
  2. 88.0 - 32 * 5/9 // правило по умолчанию
  3. 88,0 - (двойной)(32 * 5) / 9
  4. Индивидуальное приведение типов для удвоения каждого токена, который не является двойной сущностью.
  5. Несколько других способов.

Это превращается в комбинаторную проблему типа: "Во сколько способов данное выражение может быть уменьшено до двойного (какого бы типа)?"

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

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