后缀表示法正在更改评估中括号的优先级

时间:2019-06-01 08:28:17

标签: math data-structures stack complexity-theory theory

在a / b *(c +(d-e))中,将首先评估中缀表示法(d-e),但如果将其转换为后缀ab / cde-+ *,则将首先评估ab /。

为什么ab /首先在后缀中求值而不是d-e?

3 个答案:

答案 0 :(得分:1)

乘法和除法是left-associative,这意味着它们是从左到右求值的。由于 a b 是终端(无需进行进一步的评估),因此ab/已准备好进行评估。到达最后一个术语c+(d-e)后,我们需要更深入地研究,然后才能评估de-

答案 1 :(得分:1)

当您谈论“优先级”(一个旨在消除中缀符号歧义的概念,因此实际上不适用于后缀符号)时,您似乎真的是在说“操作顺序”,这是一个更广泛的概念。

要意识到的一件事是,在小学(通常是肺炎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))

时使用的基于堆栈的计算的简写形式

答案 2 :(得分:1)

两个评估指令都使用相同的参数执行相同的操作并产生相同的结果,因此从这种意义上讲,差异并不重要。

尽管如此,差异还是很重要的。在实践中评估中缀表达式时,永远不会使用小学的算术顺序,因为:

  1. 它需要存储更多中间结果。 (a + b)(c + d)(e + f)*(g + h)要求按年级顺序存储4个中间金额,但按通常的顺序仅存储2个。 / p>

  2. 在大多数情况下,实施年级到学校的命令实际上更加复杂;和

  3. 当子表达式具有副作用时,顺序变得很重要,并且通常的顺序更易于程序员进行推理。