Вычитание - порядок оценки - PullRequest
1 голос
/ 15 декабря 2009

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

Print(6 - 2 - 1)

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

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

Спасибо

Ответы [ 7 ]

5 голосов
/ 16 декабря 2009

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

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

4 голосов
/ 15 декабря 2009

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

3 голосов
/ 16 декабря 2009

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

Привет

2 голосов
/ 15 декабря 2009

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

1 голос
/ 16 декабря 2009

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

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

1 голос
/ 15 декабря 2009

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

1 голос
/ 15 декабря 2009

То, что вы хотите - это ассоциативность слева направо (в отличие от ассоциативности справа налево).

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

...