Вопрос об ассоциации оператора - PullRequest
0 голосов
/ 13 июля 2010

Большинство бинарных арифметических операторов левоассоциативны в большинстве языки программирования. Тем не менее, большинство компиляторов могут свободно оценивать операнды бинарного оператора в любом порядке. Эти заявления противоречивы? Почему или почему нет?

EDIT

Это происходит из книги, которую я читаю "Прагматика языка программирования". Глава 6, Упражнение 6.1. Я увидел, что эта книга получила хорошую рекомендацию в блоге Стива Йегге. Поэтому я решил проверить это.

http://sites.google.com/site/steveyegge2/ten-challenges

Ответы [ 3 ]

1 голос
/ 13 июля 2010

Ну, нет, они не противоречат друг другу, хотя бы потому, что в предложениях написано «большинство»: -)

В любом случае, когда порядок операций не влияет на результат, компилятор должен свободно выбирать наиболее эффективный метод. Независимо от того, как вы нарезаете и нарезаете, 7 * 2 всегда равно 2 * 7.

Рассмотрим утверждение:

a = (b + 1) * (c + 2)

Компилятор может выбрать, использует ли он:

(b + 1) * (c + 2)
(c + 2) * (b + 1)

или даже:

(b * c) + b + b + c + 2

при условии, что результаты совпадают (в пределах ожидаемых границ точности).

На самом деле, при условии, что результаты идентичны, даже утверждение вроде:

newval = 100 * PI * E / val * tot / 0.2

может перемещать отдельные компоненты без проблем. Если компилятор может достичь того же самого результата с помощью более быстрого или меньшего кода, он должен.

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

1 голос
/ 13 июля 2010

Оказывается, ассоциативность определяет, какие подвыражения являются аргументами каких операторов.Это не определяет порядок, в котором они оцениваются, хотя.

Например, левая ассоциативность определит, что f (a) - g (b) - h (c) становится (f (a) - g (a)) - h (c), но не определяетбудет ли f (a) оцениваться до g (b).

0 голосов
/ 13 июля 2010

Что происходит, когда вы оцениваете двоичную операцию в обратном порядке?

...