2009-12-15 4 views
1

Является ли он стандартным для всех языков для следующего, чтобы получить значение 3?Вычитание - Порядок оценки

Print(6 - 2 - 1) 

Другими словами, существуют ли какие-либо языки, которые будут оценивать «2 - 1» до «6 - 2»?

Я хотел бы сделать это предположение, чтобы я мог инстинктивно вставлять круглые скобки ((6 - 2) - 1). Это оставляет меня в опасности кошмаров LISP.

Благодаря

ответ

4

Обычно, когда несколько операций имеют одинаковый приоритет, они оцениваются слева направо, аналогично арифметике. Я бы не хотел говорить ВСЕ языки, потому что я не сделал опроса всех, но имеет смысл, что так должно быть. Я бы все равно внимательно прочитал документы для любого нового языка, который я собирался попробовать.

+0

Это верно для некоторых операций, но не для других. Например. Операторы присваивания в C-подобных языках оцениваются справа налево: 'x = y = 3' анализируется как' x = (y = 3) ', а не' (x = y) = 3'. Если в языке есть оператор возведения в степень, он, как правило, также будет правым и левым. –

1

То, что вы хотите, оставляется к правой ассоциативности (в отличие от правой к левой ассоциативности).

Это не гарантируется, но большинство языков являются ассоциациями слева-направо с арифметикой.

1

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

2

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

5

В Smalltalk нет математического приоритета.

Математический оператор - это всего лишь метод mames, и поэтому приоритет рассматривается как для любого другого имени метода. Ваш пример будет оцениваться как ожидалось, но, например, 1 + 2 * 3 дает 9, а не 7.

3

Только для того, чтобы упомянуть встречный пример, если память обслуживает APL, строго право-ассоциативна, поэтому 6-2-1 будет оцениваться до 5. Я ожидаю, что кто-то с установкой APL или одним из его декандаторов поместит нас правильно, если я ошибаюсь.

С уважением

+0

Не могу поверить, что я оставляю комментарий к ответу на год, но вы были правы, он оценил бы 5 на диалекте APL (проверен с J). –

1

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

Единственное семейство языков, которое я знаю об этом, имеет приоритет, но не соответствует стандартным правилам математики - это семейство APL и, в частности, язык K. В этом семействе много математических и изобретенных операторов, и они строго оцениваются справа налево. Но если вам не приходится иметь дело с этими типами языков, не беспокойтесь.

Смежные вопросы