1

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

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

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

+2

Речь идет не о конструкции компилятора - речь идет о языке. Компилятор должен делать то, что говорит спецификация языка. Теперь вы не указали, на каком языке вы говорите, что делает этот путь слишком широким - вполне возможно, что есть * языки, которые имеют такое поведение. –

+0

Почему бы не разработать язык, чтобы продвигать выражения правой стороны до уровня? Я не хочу обсуждения на конкретном языке. Существует много языков, которые демонстрируют поведение, описанное выше.Мне любопытно, почему так дизайн? – wurzja

+0

У каждого из разработчиков языка, вероятно, были свои причины, поэтому запрос «в общем», как это, слишком широк, ИМО. (Существует множество способов, при которых все выражения (или, по крайней мере, почти все выражения) имеют тип, не зависящий от контекста, в котором они используются, облегчают работу.) –

ответ

2

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

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

double x = 88.0 - 32 * 5/9 

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

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

Это превращается в комбинаторную проблему типа «В каком количестве способов данное выражение может быть сведено к двойному (независимо от типа)?»

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

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