Вопрос

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

Print(6 - 2 - 1)

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

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

Спасибо

Это было полезно?

Решение

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

Другие советы

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

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

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

С уважением

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

Вам нужна ассоциативность слева направо (в отличие от ассоциативности справа налево).

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top