Постфиксная запись меняет приоритет скобок в оценке - PullRequest
1 голос
/ 01 июня 2019

В a / b * (c + (de)) сначала будет оцениваться обозначение Infix (de), но если мы преобразуем его в Post-fix ab / cde - + *, то сначала будет оцениваться ab /.

почему ab / оценивает сначала в post-fix вместо de?

Ответы [ 3 ]

2 голосов
/ 01 июня 2019

Умножение и деление ассоциативно слева , что означает, что они оцениваются слева направо.Поскольку a и b являются терминалами (дальнейшая оценка не требуется), ab/ готов к оценке.Как только мы дойдем до последнего слагаемого, c+(d-e), нам нужно углубиться в глубину, и только тогда мы оценим de-.

1 голос
/ 03 июня 2019

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

Есть различия, которые имеют значение, хотя. Арифметический порядок начальной школы никогда не используется, когда на практике вычисляются инфиксные выражения, потому что:

  1. Требуется больше промежуточных результатов для хранения. (a + b) (c + d) (e + f) * (g + h) требует 4 промежуточных суммы для хранения в порядке начальной школы, но только 2 в обычном порядке.

  2. На самом деле в большинстве случаев реализовать порядок начальной школы сложнее; и

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

1 голос
/ 03 июня 2019

Когда вы говорите о «приоритете» (концепция, которая предназначена для устранения неоднозначности инфиксной нотации, следовательно, не очень применима к постфиксной нотации), вы действительно подразумеваете «порядок операций», что является более широким понятием.

Следует понимать, что порядок операций, которым обучают в начальной школе (часто с легочной PEMDAS), не обязательно является порядком операций, которые компьютер будет использовать при оценке выражения, подобного a/b*(c+(d-e)).Используя PEMDAS, вы сначала вычислите d-e, затем c+(d-e) и т. Д., Что равно порядку, отличному от неявного в ab/cde-+*.Но интересно отметить, что многие языки программирования на самом деле будут оценивать a/b*(c+(d-e)), используя порядок ab/cde-+*, а не наивную реализацию PEMDAS.Например, если в Python вы импортируете модуль dis и оцениваете dis.dis("a/b*(c+(d-e))") для дизассемблирования a/b*(c+(d-e)) в байт-код Python, вы получите:

          0 LOAD_NAME                0 (a)
          2 LOAD_NAME                1 (b)
          4 BINARY_TRUE_DIVIDE
          6 LOAD_NAME                2 (c)
          8 LOAD_NAME                3 (d)
         10 LOAD_NAME                4 (e)
         12 BINARY_SUBTRACT
         14 BINARY_ADD
         16 BINARY_MULTIPLY
         18 RETURN_VALUE

, который легко увидеть какточно такой же порядок операций, как у ab/cde-+*.На самом деле, эту постфиксную нотацию можно рассматривать как сокращение для стековых вычислений, которые Python использует при оценке a/b*(c+(d-e))

...